Postagens
Por que construímos um servidor MCP nativo para retros

Kelly Lewandowski
Última atualização 19/05/20267 min de leitura
"Nativo" não significa "código diferente"
/api/v1/ que qualquer pessoa com um personal access token pode chamar diretamente. Os mesmos handlers, os mesmos schemas Zod, as mesmas verificações de permissão. Se mudamos uma regra em um, o outro acompanha.Decisão 1: menos ferramentas, com toggles em vez de pares
retro_create_reaction e um retro_delete_reaction, da mesma forma que nossas rotas REST separam create de delete. Duas ferramentas por reação emoji. Multiplique isso pelos itens e comentários e você está gastando tokens de verdade com ruído antes que o modelo tenha feito qualquer coisa útil.retro_toggle_reaction é uma ferramenta só que liga ou desliga um emoji dependendo de quem chamou já ter reagido. Ela retorna "added" ou "removed" na resposta, então o modelo pode narrar o que aconteceu sem armazenar ids de reação que só seriam necessários para chamar delete.Decisão 2: escreva dicas dentro das descrições, não na documentação
userId e um kudoType e retornava um erro amigável se você passasse alguém que não estivesse no space. Os modelos consistentemente inventavam um id de usuário, batiam no erro, pediam desculpas, e pediam ao usuário para colar o id correto. Inútil.retro_create_item se não houver). O recebedor
precisa ser membro do space do retro — use organization_list_users
(suporta um filtro de busca) para procurar o id do usuário pelo nome.organization_list_users com o nome que o usuário falou em voz alta, pega o id, e dá os kudos de uma só vez. O handler não mudou. A dica sim.
retro_update avisa dentro da descrição que excluir uma coluna também exclui todos os itens dela. retro_cast_item_vote menciona explicitamente o limite de votos por board e por coluna para que o modelo possa avisar o usuário antes de bater no 400. Todo "você precisa saber disso para me chamar corretamente" vai dentro da ferramenta, não em um guia separado que ninguém lê.Decisão 3: uma ferramenta de busca semântica, não uma cadeia de list-and-filter
retro_list, depois retro_list_items para cada resultado, e então ler todos eles para o contexto. Isso é uma tempestade de chamadas de ferramenta que custa dinheiro ao usuário e produz uma resposta pior do que um grep daria.search que roda busca semântica em todo o space de uma só vez. Ela retorna itens de retro, comentários, action items, respostas de standup, respostas de enquetes, respostas de ice-breaker e notas, ranqueados por similaridade de cosseno em relação à consulta, agrupados por tipo. O modelo recebe os 20 resultados mais relevantes em uma chamada em vez de se espalhar por centenas de registros.Decisão 4: consentimento por funcionalidade no momento do OAuth
O que isso significa no quadro do retro
Pré-popular o board
"Abra o retro desta sprint e adicione itens dos post-mortems que escrevemos no Linear nesta quinzena, um por incidente, na coluna O Que Poderia Melhorar." O modelo cria os itens, marca como anônimos onde o ticket de origem era, e para. Encontre contexto de retros antigos
"Já falamos sobre instabilidade de CI antes?" A busca semântica retorna os três retros onde o assunto apareceu e os action items que saíram deles, em uma chamada. Transforme discussão em action items
"Crie action items a partir dos três itens mais votados do board, atribua cada um a quem o escreveu, prazo sexta-feira." retro_list_itemse em seguida algumas chamadas aaction_item_create. O modelo faz a atribuição a partir do autor do item.Dê kudos pelo nome
"Dê kudos à Priya por desbloquear a migração." O modelo chama organization_list_userscom uma busca por "Priya," e então anexa os kudos.
O que faríamos de novo, o que pularíamos
retro_get. Os modelos então resumiam o resumo, e a latência triplicou. O chato venceu. A ferramenta MCP retorna o mesmo formato que o endpoint REST. IA em cima disso é o usuário que opta via prompt, não algo que a gente embute no protocolo./api/v1/. O trabalho interessante está nas definições das
ferramentas: nomeação, agrupamento, dicas, e quais ações são reduzidas a um
único toggle. A lógica de backend é compartilhada.retro_create_item aceita uma flag anonymous,
e retro_create_item_comment também. Quando ativada, a resposta
omite o id do usuário autor, do mesmo jeito que a UI faz. Anonimato é
garantido no nível do handler, não na descrição.retro_update avisa que excluir uma
coluna também exclui todos os itens dela. Confiamos no modelo para trazer
isso ao usuário antes de chamá-la, do mesmo jeito que um desenvolvedor lendo
a documentação notaria o aviso. Não há um passo separado de confirmação
dentro do protocolo.