Painel Sintético Concorde
Servidor MCP remoto que expõe um painel de 787 personas sintéticas do consumidor bancário brasileiro para qualquer Claude (Desktop, web, mobile) — para discovery de produtos bank e fintech. Roda inteiro no free tier da Cloudflare Workers.
Site e demo: https://painel.concorde-painel.workers.dev
Nome no registro oficial de MCP: io.github.caio-sartoratto/painel-sintetico-concorde
Como instalar / encontrar
O painel é um conector MCP remoto. Não há nada para baixar.
- No Claude (Desktop, web ou mobile): Settings → Connectors → Add custom connector
- Cole a URL:
https://painel.concorde-painel.workers.dev/mcp - Requer plano pago do Claude (conectores customizados não estão no plano gratuito)
Ele também está publicado no registro oficial de MCP
como io.github.caio-sartoratto/painel-sintetico-concorde, então tende a aparecer em
marketplaces e agregadores de MCP que consomem o registro. A instalação, porém, continua sendo
pela URL acima (estar no registro não adiciona o conector automaticamente ao Claude).
Os dados do painel não estão neste repositório (são proprietários — veja a licença). Este repo é o motor: servidor MCP, site, fórum, cotas e telemetria. O serviço público roda com o painel completo.
Por que existe
Pedir a um LLM para "simular 700 pessoas" produz um respondente médio repetido N vezes, com
viés de renda/escolaridade (Santurkar et al. 2023; Bisbee et al. 2024). O caminho que funciona
é condicionar o modelo em atributos sociodemográficos reais (Argyle et al. 2023). Aqui a
heterogeneidade vem da estrutura: cada persona é ligada por filtro determinístico
(campo operador valor) a fatos estatísticos com fonte, e o LLM só dá voz.
Dois modos: focus group e pesquisa
- Focus group (exploração qualitativa):
filtrar_personas/sortear_amostra+get_personas. O Claude dá voz a um recorte pequeno de personas para você ouvir objeções e afiar hipóteses. - Pesquisa direcional (medição):
preparar_pesquisafaz fan-out isolado — o host dispara uma tarefa/subagente por persona, cada uma responde sem ver as outras, e a distribuição é agregada localmente. Isso evita a convergência artificial de respostas geradas no mesmo contexto. Formatos:escolha(distribuição),pontuar(nota 0-10 por atributo → média+desvio por opção, preserva a preferência secundária),escalaeaberta. Oseedé aleatório por padrão e devolvido no resultado para reprodução. É o mecanismo por trás dos backtests abaixo.
Privacidade por construção: a pergunta do usuário não trafega pelo servidor. A fronteira de
confiança é classificada localmente no Claude (a ferramenta avaliar_pergunta devolve só a
rubrica), e as respostas das personas são agregadas no host — o servidor recebe apenas o filtro de
segmento, o número de personas e o formato.
Validação (backtest contra pesquisa real)
100 personas sorteadas do painel, classificadas com temperatura 0 (reproduzível), comparadas a pesquisas publicadas.
idwall 2025 (amostra nacional ponderada por IBGE)
| Pergunta de atitude do consumidor | idwall | Painel | Erro |
|---|---|---|---|
| Pretende manter/aumentar uso de bancos digitais | 84,9% | 86,0% | 1,1 pp |
| Rapidez do cadastro é o fator nº 1 na abertura de conta | 51,4% | 49,0% | 2,4 pp |
| A casa é o lugar mais seguro para acessar o banco | 68,5% | 74,0% | 5,5 pp |
Erro médio absoluto: 3,0 pp — as três dentro de 6 pontos percentuais do benchmark.
Reclame AQUI 2026 (crise de confiança em bancos digitais, n=2.073)
| Atitude do consumidor | Reclame AQUI | Painel | Erro |
|---|---|---|---|
| Medo de a instituição quebrar e perder o dinheiro (liquidez) | 35% | 39% | 4 pp |
BCG e Nubank, "Beyond Access" 2023 (população brasileira, n=2.000)
Headline do estudo: mais de 70% dos brasileiros não se sentem seguros nem incluídos financeiramente. O painel, de forma independente, chega a 78%.
Sem nenhuma quebra por classe no benchmark, o painel reproduz sozinho o gradiente social da insegurança (amostra estratificada por classe, temperatura 0):
| Classe | Se sente inseguro | Amostra |
|---|---|---|
| A | 5% | n=22 |
| B | 20% | n=30 |
| C | 77% | n=30 |
| D/E | 80% | n=30 |
Controle: e se for só o LLM?
As mesmas perguntas respondidas direto por modelos de fronteira, sem painel, sem persona, sem busca na internet, temperatura 0:
| Pergunta | Real | Painel | Gemini 3.1 Pro | GPT-5.6 |
|---|---|---|---|---|
| Mantém ou aumenta o uso de bancos digitais | 84,9% | 86% | 84% | 85% |
| Rapidez do cadastro é o fator nº 1 | 51,4% | 49% | 18% | 25% |
| A casa é o lugar mais seguro para acessar | 68,5% | 74% | 65% | 90% |
| Medo de a instituição quebrar (liquidez) | 35% | 39% | 45% | 65% |
| Erro médio absoluto | 3,3 pp | 12,0 pp | 19,5 pp |
O painel erra 3,7x menos que o Gemini e 6x menos que o GPT nas mesmas perguntas. No headline do BCG: painel 78% (dentro do ">70%"), Gemini 55% (fora), GPT 60% (fora). Os números dos modelos crus ainda contradizem a si mesmos: o Gemini estima 45% "seguros e incluídos" mas só 31% "seguros", e a interseção não pode ser maior que a parte. O painel não produz esse erro porque cada número vem de contar personas uma a uma.
Transparência: essas são as perguntas de melhor aderência entre as categorias testadas. Itens de satisfação e incidência auto-reportada divergem mais (viés de calibração conhecido nas narrativas, em ajuste). Não substitui pesquisa primária nem teste A/B — é a etapa barata que vem antes.
Exemplos
Transcrições reais rodando no Claude (personas e fatos vêm do painel de verdade):
examples/ — focus group de conceito, teste com Classe A e checagem de dado.
Arquitetura
vault Obsidian (fonte da verdade: personas + fatos + vozes + instituições)
│ npm run build-data (compila markdown → JSON)
▼
Cloudflare Worker
├─ /mcp servidor MCP (agents SDK / McpAgent + Durable Object)
│ 10 ferramentas: visao_geral, avaliar_pergunta (rubrica da
│ fronteira p/ classificação LOCAL), filtrar_personas,
│ sortear_amostra, preparar_pesquisa (fan-out isolado),
│ get_personas, buscar_fatos, listar_vozes, get_instituicao,
│ get_distribuicoes
├─ QuotaDO cotas por IP (rajada/dia + teto de fichas: anti-extração)
├─ / site estático server-rendered (zero framework)
├─ /forum fórum anônimo sem moderação prévia (ForumDO) — nunca exposto via MCP
│ (evita prompt injection armazenada em sessões de terceiros)
└─ StatsDO telemetria própria (IPs só como hash; dashboard admin)
Decisões que valem nota:
- DSL de filtro própria (sem eval):
classe_social == 'Classe C' & idade > 30, mesma sintaxe do vault ao servidor. - Fatos tipados (propensão / prevalência / composição / referência) — composição é P(público|métrica), o inverso de propensão; o servidor injeta aviso na ficha quando presente.
- Cotas via Durable Object por IP: extração em massa do painel é impraticável sem autenticação de usuários.
- Fórum fora do MCP por regra: conteúdo aberto de terceiros nunca volta por ferramenta, eliminando o vetor de injection armazenada.
Rodando
Pré-requisitos: Node 20+, conta Cloudflare, um vault no formato esperado (veja
scripts/build-data.mjs para o schema de frontmatter).
npm install
VAULT_DIR=/caminho/do/vault npm run build-data # gera src/data/*.json (não versionado)
npm run dev # local em http://localhost:8787
npx wrangler secret put ADMIN_TOKEN # kill switch do fórum + dashboard
npx wrangler secret put HASH_SALT # sal dos hashes de IP
npm run deploy
Licença
Código sob MIT. Os dados do painel (personas, fatos, vozes, fichas de instituições e distribuições) são proprietários, não incluídos neste repositório e não licenciados para redistribuição.
Autor
Caio Sartoratto Prado — LinkedIn · projeto Concorde. Feedback: fórum do painel.