- ASP.NET Core 9 Razor Pages + Minimal API hybrid - 14 validators (CPF, CEP, CNPJ, email, phone, name, yes-no, birthdate, handoff, cancel-intent, company-name, plate-br, postal-code, validate_reply) - OAuth login (Google, Microsoft, GitHub) + cookie auth - MongoDB usage tracking + CEP cache collection - Stripe checkout with inline PriceData (no Price IDs) - MCP server for Claude Code / Cursor integration - Playground (10 calls/IP/day, no auth) - Docs: Quickstart, API Reference, N8N, MCP, Créditos, Erros, Fluxos - Credit system: 3 cr standard validators, 5 cr validate_reply - SmartSuggestion: contextual re-ask via IA when obtained=false - Per-IP rate limiting + daily cap + shared-IP abuse detection - Lightbox for comic images - Validadores page split: Brasileiros / Universais + Em breve Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
242 lines
8.6 KiB
Markdown
242 lines
8.6 KiB
Markdown
# 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 |