- 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>
8.6 KiB
Prompt 2 — NALU AI: Validadores adicionais + MCP Server
Pré-requisito: o projeto do Prompt 1 já está funcionando com
POST /v1/extract/namee o validadorvalidate_full_name.md.
Parte A — Novos validadores + endpoints
Para cada validador abaixo:
- Criar o arquivo
.mdemValidators/seguindo o mesmo formato devalidate_full_name.md - Registrar o endpoint em
ExtractEndpoints.cs(2 linhas, mesmo padrão) - 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:
{
"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.comgamil.com,gmaill.com,gnail.com→gmail.comhotmal.com,hotmial.com→hotmail.comoutlok.com→outlook.comyaho.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 oextracted_valuee prossiga para o próximo passo. Secertain: falseesuggestion_to_agentnão é null, use a sugestão como próxima mensagem ao usuário. Seobtained: 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:
{
"mcpServers": {
"nalu": {
"url": "http://localhost:5000/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
Testes MCP
- Teste que simula
tools/liste verifica que todas as tools estão listadas - Teste que chama
tools/callnonalu_extract_namee verifica a resposta - Teste que verifica que um novo
.mdadicionado aparece emtools/list
Resumo de arquivos a criar/modificar
Criar:
Validators/validate_cpf.mdValidators/validate_cep.mdValidators/validate_phone_br.mdValidators/validate_email.mdValidators/validate_yes_no.mdPostProcessors/ValidateCpfDigit.csPostProcessors/FormatPhone.csPostProcessors/CorrectEmailTypos.csEnrichers/ViaCepEnricher.csMcp/NaluMcpServer.cs(ou equivalente)mcp-config.json- Testes para os novos validadores e MCP
Modificar:
ExtractEndpoints.cs— adicionar 5 novos endpointsPostProcessorRegistry.cs— registrar novos processadoresEnrichmentService.cs— registrar ViaCepEnricherProgram.cs— registrar MCP server e novos serviços