Sequential Thinking
Como usar o MCP de raciocínio sequencial para planejar e executar operações complexas no FormFlow
O FormFlow expõe operações com múltiplas etapas interdependentes: criar variáveis, associá-las a formulários, capturar dados e validar resultados. O Sequential Thinking é um MCP que estrutura esse raciocínio em passos revisáveis antes da execução.
Quando usar
Use Sequential Thinking antes de chamar reasonFormFlowPlan ou encadear chamadas manuais ao FormFlow quando:
- A operação envolve 3 ou mais etapas interdependentes
- Você precisa decidir quais variáveis já existem antes de criar novas
- O escopo correto (
lead,conversation,global) não está explícito nas instruções recebidas - Há risco de criar duplicatas ou sobrescrever dados importantes
- A instrução é ambígua e precisa de refinamento antes da execução
Como funciona
O Sequential Thinking emite pensamentos numerados (thoughtNumber / totalThoughts). Cada pensamento pode:
- Avançar o raciocínio para a próxima etapa
- Revisar um pensamento anterior (
isRevision: true,revisesThought: N) - Criar um ramo alternativo (
branchFromThought,branchId) - Estimar que mais passos são necessários (
needsMoreThoughts: true)
O processo termina quando nextThoughtNeeded: false e uma conclusão clara foi atingida.
Padrão de uso com o FormFlow
1. Entender o estado atual
Antes de planejar, consulte o que já existe:
// Passo 1 do Sequential Thinking: levantar o contexto
// "Preciso saber quais variáveis e formulários já existem antes de planejar qualquer criação"
const [fields, catalogs] = await Promise.all([
fetch('{BASE_URL}/getFormFields', { method: 'POST', ... }).then(r => r.json()),
fetch('{BASE_URL}/getFormCatalogs', { method: 'POST', ... }).then(r => r.json())
]);
2. Raciocinar sobre o que criar vs reutilizar
Pensamento 1: A instrução pede "formulário de pré-vendas com email e telefone".
→ Preciso verificar se variáveis com keyName "lead_email" e "lead_phone" já existem.
Pensamento 2: Encontrei "lead_email" (id: abc) mas não encontrei "lead_phone".
→ Plano: criar "lead_phone", depois criar o catálogo associando ambas.
Pensamento 3 (revisão do 2): O escopo pedido é "leads".
→ A variável "lead_email" existente tem scope "conversation" — isso pode causar conflito.
→ Revisar: criar nova variável com scope "lead" ou atualizar a existente?
3. Gerar o plano final
Após o Sequential Thinking concluir, envie as instruções refinadas para reasonFormFlowPlan:
curl -X POST {BASE_URL}/reasonFormFlowPlan \
-H "Authorization: Bearer {TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"instructions": "Criar variável lead_phone com scope lead e tipo phone. Criar formulário Pré-vendas com scope lead associando lead_email (id: abc) e a nova lead_phone.",
"options": {
"maxSteps": 4,
"model": "gpt-oss-120b",
"provider": "cerebras"
},
"executeAfterPlan": true
}'
Exemplo completo
O exemplo abaixo mostra a sequência de pensamentos típica para uma operação de criação de formulário:
[Pensamento 1/5]
Instrução recebida: "Crie um formulário chamado Qualificação com nome, email e empresa do lead".
Preciso primeiro verificar o que já existe no host antes de criar qualquer coisa.
→ nextThoughtNeeded: true
[Pensamento 2/5]
Consultei getFormFields. Encontrei:
- "lead_name" (scope: lead) ✅
- "lead_email" (scope: lead) ✅
- "lead_company" → não existe
Precisarei criar "lead_company".
→ nextThoughtNeeded: true
[Pensamento 3/5]
Consultei getFormCatalogs. Não existe formulário com nome "Qualificação".
Posso prosseguir com a criação.
→ nextThoughtNeeded: true
[Pensamento 4/5]
Plano definido:
1. createVariable → lead_company (type: text, scope: lead)
2. createCatalog → Qualificação (scope: lead, variableIds: [lead_name.id, lead_email.id, $step1.id])
Sem ambiguidades. Plano pronto para enviar ao reasonFormFlowPlan.
→ nextThoughtNeeded: true
[Pensamento 5/5]
Instrução refinada para o reasonFormFlowPlan:
"Criar variável lead_company (text, scope lead). Criar formulário Qualificação (scope lead)
associando as variáveis existentes lead_name (uuid-a) e lead_email (uuid-b) e a nova lead_company."
→ nextThoughtNeeded: false
Integração com execução via WebSocket
Após enviar o plano ao reasonFormFlowPlan com executeAfterPlan: true, monitore a execução em tempo real:
socket.on('form_flow_step_executed', ({ stepNumber, totalSteps, action, success, realtimeInstructions }) => {
console.log(`Step ${stepNumber}/${totalSteps} — ${action}: ${success ? '✅' : '❌'}`);
realtimeInstructions?.forEach(msg => appendToLog(msg));
});
socket.on('form_flow_plan_generated', ({ totalSteps, plan }) => {
renderPlanPreview(plan, totalSteps);
});
Quando o Sequential Thinking evita erros
| Situação | Sem Sequential Thinking | Com Sequential Thinking |
|---|---|---|
Variável com mesmo keyName já existe | 400 Conflict ou duplicata silenciosa | Detecta antes e reutiliza o ID existente |
| Escopo ambíguo na instrução | Cria com escopo errado | Solicita clarificação antes de executar |
| Formulário com nome parecido já existe | Cria duplicata | Detecta e pergunta se deve atualizar |
| Step 2 depende do ID gerado no Step 1 | Referência $previous.id falha se Step 1 falhou | Valida a saída do Step 1 antes de continuar |
O Sequential Thinking não executa nenhuma ação — ele apenas estrutura o raciocínio. A execução sempre passa pelo FormFlow via reasonFormFlowPlan ou chamadas diretas aos endpoints.