# Prompt 2 — NALU AI: Validadores adicionais + MCP Server

> **Pré-requisito:** o projeto do Prompt 1 já está funcionando com `POST /v1/extract/name` e o validador `validate_full_name.md`.

---

## Parte A — Novos validadores + endpoints

Para cada validador abaixo:
1. Criar o arquivo `.md` em `Validators/` seguindo o mesmo formato de `validate_full_name.md`
2. Registrar o endpoint em `ExtractEndpoints.cs` (2 linhas, mesmo padrão)
3. Criar pós-processadores e enrichers necessários

### 1. `validate_cpf.md` → `POST /v1/extract/cpf`

Extrai e valida CPF (11 dígitos, algoritmo mod 11).

**Config MCP:**
- mcp_tool: nalu_extract_cpf
- mcp_description: Extrai e valida o CPF do usuário. Valida dígitos verificadores automaticamente. Se certain=true, o CPF é válido e pode ser usado. Se certain=false, use suggestion_to_agent para pedir correção.

**Regras determinísticas:**
- Aceitar: `123.456.789-09`, `12345678909`, `123 456 789 09`
- Rejeitar sequências repetidas: `111.111.111-11`, `000.000.000-00`, etc.
- Validar dígitos verificadores (mod 11)
- Rejeitar se não tiver exatamente 11 dígitos numéricos

**Prompt LLM:** extrair CPF mesmo quando informal ("meu cpf é um dois três quatro...") ou no meio de frase longa.

**Few-shot (mínimo 5):**
- CPF válido direto
- CPF no meio de frase
- CPF com dígito errado
- Resposta evasiva ("não lembro")
- CPF escrito por extenso

**Pós-processador:** `ValidateCpfDigit` — validar mod 11, formatar `XXX.XXX.XXX-XX`

**Sugestões:**
- when_null_evasive: "Preciso do seu CPF para continuar. São 11 dígitos, pode digitar?"
- when_invalid: "Esse CPF parece estar incorreto. Pode verificar e digitar novamente?"
- when_uncertain: "Só confirmando: seu CPF é {{extracted_value}}?"

---

### 2. `validate_cep.md` → `POST /v1/extract/cep`

Extrai CEP (8 dígitos) e enriquece com endereço via ViaCEP.

**Config MCP:**
- mcp_tool: nalu_extract_cep
- mcp_description: Extrai o CEP do usuário e retorna o endereço completo (logradouro, bairro, cidade, estado). Se certain=true, o endereço está confirmado. Se obtained=false, o CEP é inválido — use suggestion_to_agent.

**Regras determinísticas:**
- Aceitar: `01001-000`, `01001000`
- Rejeitar se não tiver 8 dígitos
- Rejeitar `00000-000`

**Enricher:** `ViaCepEnricher`
- Chamar `https://viacep.com.br/ws/{cep}/json/`
- Se retornar `erro: true`, marcar obtained: false
- Fallback: `https://brasilapi.com.br/api/cep/v2/{cep}`

**extracted_value quando enriquecido:**
```json
{
  "cep": "01001-000",
  "logradouro": "Praça da Sé",
  "bairro": "Sé",
  "cidade": "São Paulo",
  "estado": "SP"
}
```

**Sugestões:**
- when_invalid: "Esse CEP não parece válido. Pode verificar? Formato: XXXXX-XXX"
- when_enriched_certain: "Encontrei: {{logradouro}}, {{bairro}} — {{cidade}}/{{estado}}. Correto?"
- when_not_found: "Não encontrei esse CEP. Pode verificar e digitar novamente?"

---

### 3. `validate_phone_br.md` → `POST /v1/extract/phone`

Extrai telefone brasileiro com DDD.

**Config MCP:**
- mcp_tool: nalu_extract_phone
- mcp_description: Extrai o número de telefone brasileiro do usuário, incluindo DDD. Formata automaticamente. Se certain=true, o número é válido.

**Regras determinísticas:**
- Aceitar: `(11) 99999-9999`, `11999999999`, `+55 11 99999-9999`, `11 99999 9999`
- DDD válido: 11-99
- Celular: 9 dígitos começando com 9
- Fixo: 8 dígitos começando com 2-5

**Pós-processador:** `FormatPhone` — normalizar para `(XX) XXXXX-XXXX` ou `(XX) XXXX-XXXX`

**Sugestões:**
- when_invalid: "Não consegui identificar o telefone. Pode digitar com DDD? Ex: (11) 99999-9999"
- when_uncertain: "Seu telefone é {{extracted_value}}? Pode confirmar?"

---

### 4. `validate_email.md` → `POST /v1/extract/email`

Extrai email com correção de typos.

**Config MCP:**
- mcp_tool: nalu_extract_email
- mcp_description: Extrai o email do usuário com correção automática de typos em domínios comuns (gmail, hotmail, outlook). Se houve correção, certain=false para o agente confirmar.

**Regras determinísticas:**
- Regex de email
- Rejeitar sem @ ou sem ponto após @

**Pós-processador:** `CorrectEmailTypos`
- `gmail.com.br` → `gmail.com`
- `gamil.com`, `gmaill.com`, `gnail.com` → `gmail.com`
- `hotmal.com`, `hotmial.com` → `hotmail.com`
- `outlok.com` → `outlook.com`
- `yaho.com` → `yahoo.com`

Se corrigiu: certain=false, guardar original para a sugestão.

**Sugestões:**
- when_corrected: "Seu email é {{extracted_value}}? (notamos um possível erro em '{{original}}')"
- when_invalid: "Não parece um email válido. Pode digitar novamente?"

---

### 5. `validate_yes_no.md` → `POST /v1/extract/yes-no`

Detecta sim/não.

**Config MCP:**
- mcp_tool: nalu_extract_yes_no
- mcp_description: Detecta se o usuário respondeu sim ou não. Retorna true (sim), false (não), ou null (ambíguo). Ideal para confirmações. Se ambíguo, use suggestion_to_agent para re-perguntar.

**Regras determinísticas:**
- Sim: sim, s, ss, yes, si, pode, claro, com certeza, bora, vamos, isso, exato, beleza, blz, ok, tá, aham, uhum, positivo, aceito, quero, concordo, fechado, feito, show, top, massa, dale
- Não: não, nao, n, no, nope, nada, nunca, jamais, nem, negativo, recuso, discordo, não quero, de jeito nenhum

Quando ambíguo → LLM interpreta com contexto.

**extracted_value:** `true`, `false`, ou `null`

**Sugestões:**
- when_ambiguous: "Desculpa, não entendi. Pode responder sim ou não?"

---

## Parte B — MCP Server

Adicionar MCP ao mesmo projeto ASP.NET Core, expondo cada validador como uma tool.

### Transporte
**Streamable HTTP** no endpoint `/mcp`.

### Tools registradas

Cada validador gera uma tool MCP automaticamente, usando os campos `mcp_tool` e `mcp_description` do seu arquivo `.md`:

```
nalu_extract_name     — parâmetros: agent_input, user_input, agent_context?, language?
nalu_extract_cpf      — parâmetros: agent_input, user_input, agent_context?, language?
nalu_extract_cep      — parâmetros: agent_input, user_input, agent_context?, language?
nalu_extract_phone    — parâmetros: agent_input, user_input, agent_context?, language?
nalu_extract_email    — parâmetros: agent_input, user_input, agent_context?, language?
nalu_extract_yes_no   — parâmetros: agent_input, user_input, agent_context?, language?
```

Todos compartilham os mesmos parâmetros de entrada e o mesmo formato de resposta. Internamente, cada tool chama `ExtractionPipeline.ExecuteAsync(validator_id, request)`.

### Registro dinâmico de tools

O MCP server deve gerar a lista de tools **automaticamente** a partir dos arquivos `.md` na pasta `Validators/`. Quando um novo `.md` é adicionado com as configs `mcp_tool` e `mcp_description`, ele aparece automaticamente em `tools/list`.

### Instrução para o agente consumidor

Incluir no `mcp_description` de cada tool:
> Se `certain: true`, aceite o `extracted_value` e prossiga para o próximo passo.
> Se `certain: false` e `suggestion_to_agent` não é null, use a sugestão como próxima mensagem ao usuário.
> Se `obtained: false`, use a sugestão para re-pedir o dado ao usuário.

### Auth
- API key via `Authorization: Bearer {key}` no header HTTP
- Mesma validação de auth e rate limit do REST

### Implementação

Verificar se existe pacote NuGet `ModelContextProtocol` maduro para C#. Se sim, usá-lo. Se não, implementar manualmente:
- Endpoint POST `/mcp` (Streamable HTTP)
- Responder a `initialize`, `tools/list`, `tools/call`
- JSON-RPC 2.0
- Content-Type: `application/json`

### Arquivo de setup para devs

Criar `mcp-config.json` na raiz para facilitar conexão:

```json
{
  "mcpServers": {
    "nalu": {
      "url": "http://localhost:5000/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}
```

### Testes MCP

- Teste que simula `tools/list` e verifica que todas as tools estão listadas
- Teste que chama `tools/call` no `nalu_extract_name` e verifica a resposta
- Teste que verifica que um novo `.md` adicionado aparece em `tools/list`

---

## Resumo de arquivos a criar/modificar

### Criar:
- `Validators/validate_cpf.md`
- `Validators/validate_cep.md`
- `Validators/validate_phone_br.md`
- `Validators/validate_email.md`
- `Validators/validate_yes_no.md`
- `PostProcessors/ValidateCpfDigit.cs`
- `PostProcessors/FormatPhone.cs`
- `PostProcessors/CorrectEmailTypos.cs`
- `Enrichers/ViaCepEnricher.cs`
- `Mcp/NaluMcpServer.cs` (ou equivalente)
- `mcp-config.json`
- Testes para os novos validadores e MCP

### Modificar:
- `ExtractEndpoints.cs` — adicionar 5 novos endpoints
- `PostProcessorRegistry.cs` — registrar novos processadores
- `EnrichmentService.cs` — registrar ViaCepEnricher
- `Program.cs` — registrar MCP server e novos serviços