Mukutu · Ekyte · ekyte-mcp + CLI muk-ekyte

Central Ekyte

Guia de uso do ekyte-mcp — a CLI muk-ekyte, o servidor MCP no Claude Code e o relatório de consumo de pacote de manutenção — além da verificação semanal de apontamento, que roda sozinha. Ao final, a skill de cronograma de projeto (§07) e uma comparação com o MCP oficial do Ekyte (§08).

🔴 vermelho · 0h 🟡 amarelo · abaixo da meta 🟢 verde · meta atingida

01 O que é

Uma fonte de dados, duas formas de acessar — mesma lógica de negócio (src/hours.ts).

O ekyte-mcp (repo privado mktvirtual/mukutu-mono, pasta apps/ekyte-mcp) responde a uma pergunta: quem lançou e quem não lançou horas no Ekyte. Ele deriva o time automaticamente (quem tem apontamento nos últimos 30 dias), aplica a meta de horas por pessoa e um calendário de dias úteis, e devolve o semáforo 🔴🟡🟢.

Como o semáforo é calculado

Soma as horas de apontamentos Concluídos cujo dia de trabalho é a data avaliada, dentro do escopo. Então:

🔴 vermelhohoras = 0 — não lançou nada.
🟡 amarelo0 < horas < meta — lançou, mas abaixo da meta.
🟢 verdehoras ≥ meta — bateu ou passou.

Meta: por pessoa, em config/thresholds.json. Hoje é 6h para todo o time (sem exceções). Ajustável por pessoa (ex.: meio-período → 4h) só editando esse arquivo, sem mexer no código.

Anti-falso-alarme: janela de atraso de 4 dias (lançamento tardio ainda conta no dia trabalhado); só dias úteis contam como "faltou"; fuso America/São Paulo.

CLI muk-ekyte
instalada ✔
MCP ekyte-mcp
conectado ✔
EKYTE_API_KEY
no ambiente ✔

02 CLI muk-ekyte

A superfície de terminal. Saída em tabela colorida quando é um terminal; JSON quando a saída é redirecionada (para jq, scripts, etc.).

# time todo, hoje — 🔴🟡🟢
muk-ekyte hours

# só quem está devendo horas (🔴 + 🟡)
muk-ekyte hours --status red,yellow

# escopo Mukutu — "muk" pega Mukutu* E o typo "Muktu | 3M"
muk-ekyte hours --workspace muk --status red,yellow

# um dia específico (a flag --date exige ISO AAAA-MM-DD), em JSON
muk-ekyte hours --date 2026-07-15 --format json | jq '.people'

# histórico de uma pessoa nos últimos 14 dias
muk-ekyte person "Kayo" --period 14
Escopo Mukutu resolvido: use --workspace muk. O substring muk casa tanto os ~35 workspaces Mukutu* (incluindo os "Mukutu - Cliente") quanto o Muktu | 3M (typo, id 141790) — e nenhum outro workspace contém "muk", então não há falso positivo. Verificado em 17/07/2026: 15 pessoas no escopo.

03 MCP ekyte-mcp no Claude Code

A superfície conversacional. Registrada no escopo user (vale em todos os projetos). É só perguntar em linguagem natural.

> quem não lançou horas hoje?
> status de horas do time em 15/07/2026
> histórico da Larissa nos últimos 14 dias
> quem está vermelho ou amarelo no escopo mukutu?

Por baixo, o Claude chama uma destas ferramentas:

ekyte_hours_statusTime inteiro num dia: horas lançadas vs. meta, com semáforo.> quem lançou horas hoje?> status de horas do time em 15/07/2026
ekyte_missingSó os que ficaram abaixo da meta naquele dia (🔴 + 🟡).> quem não lançou (ou lançou pouco) hoje?> quem está vermelho ou amarelo no escopo mukutu?
ekyte_personHistórico dia a dia de uma pessoa numa janela recente.> histórico da Larissa nos últimos 14 dias> como o Kayo andou lançando horas essa semana?
ekyte_maintenance_statusPor projeto de manutenção: horas consumidas no mês vs. o pacote (ex.: 8h) lido do nome do projeto. novo · ver §04> status das manutenções deste mês> quais manutenções estouraram o pacote?
ekyte_person_projectsHoras de uma pessoa distribuídas por projeto no mês (cliente, interno, não-mapeado).> horas da Ana por projeto em julho> quanto o time fez de manutenção vs. projeto este mês?
ekyte_fill_hours_planCaminho de escrita (preencher horas) — inerte por design: só devolve um plano, nunca escreve sozinho.> monta um plano pra lançar 2h de reunião ontem
Reinício necessário uma vez: o servidor MCP herda a EKYTE_API_KEY do ambiente no momento em que o Claude Code é iniciado. Como a chave foi definida agora, reinicie o Claude Code para o MCP passar a devolver dados reais. A CLI já funciona em qualquer terminal novo.
Frescor sinalizado automaticamente: cada ferramenta devolve um bloco meta de frescor. Se o dado for provisório — dia de hoje ainda aberto, mês em andamento, ou dentro da janela de lançamento tardio (~4 dias) — vem um alert claro, que é sempre repassado a você. Assim dá pra saber na hora se o número é fechado ou parcial, sem depender de reinício. E as datas saem sempre em dd/mm/aaaa (a entrada aceita tanto dd/mm/aaaa quanto ISO).

04 Manutenção: horas do mês vs. pacote novo

Uma pergunta diferente do semáforo diário: de cada projeto de manutenção, quanto do pacote mensal de horas já foi consumido no mês. Feito para relatório de cliente e diretoria.

O tool ekyte_maintenance_status responde, por projeto de manutenção: quantas horas foram lançadas no mês e se o pacote mensal (ex.: 8h, escrito no nome do projeto) já foi atingido. Enquanto o semáforo das seções anteriores é pessoa × dia, este é projeto × mês.

Como o número é montado

Pacotelido do nome do projeto (ex.: MWM Manutenção | 18314 - 8h8h/mês). Projeto sem Nh no nome vem como no_package.
Consumidosoma direta dos apontamentos (status 20+10) com dia de trabalho no mês — o mesmo número da tela Estatísticas de Apontamento do Ekyte.

Status de cada projeto:

overconsumido > pacote — estourou o pacote do mês.
okconsumido dentro do pacote.
unused0h no mês — pacote sem uso.
no_packageprojeto de manutenção sem pacote no nome.

Como usar

Em linguagem natural, pelo Claude Code:

> status das manutenções deste mês
> consumo de pacote da manutenção em 2026-06
> como está o pacote de manutenção do MWM?
> manutenções que estouraram o pacote

Parâmetros do tool (todos opcionais):

monthAAAA-MM — mês a avaliar. Padrão: mês corrente (Brasília).
workspacefiltra por cliente (substring do nome do workspace no Ekyte).
matchamplia o termo do nome. Padrão manuten; ex.: manuten|sustenta|suporte.

O que volta

ProjetoPacote/mêsConsumido%Status
CRPMA Manutenção12h20,8h173%over
Ancord Manutenção20h28,9h145%over
Hirota Manutenção10h9,0h90%ok
Master Expresso Manutenção8h0h0%unused

Exemplo real de julho/2026 (mês fechado), pelo método de soma direta. O retorno completo traz ainda remaining_hours, end_date, expired, um summary (contagem por status) e a coverage.

Como o consumido é atribuído (bate com a UI do Ekyte). Soma direta dos apontamentos — não usa o join tarefa→projeto (que passava por um snapshot de tarefas abertas e subestimava: ex. CRPMA jul lia 18,8h vs. os 20h47m reais). Regra: workspace de manutenção puro (só o projeto de manutenção) → conta o workspace inteiro; workspace misto (site + manutenção — MWM, Ancord, FIA, Nita) → conta só as tarefas cujo título começa com “<Cliente> Manutenção” (então “[Ancord - Novo Site] - Ajustes de Manutenção” é site, não manutenção).
Flag expired. Vários projetos de manutenção têm data de término no passado mas continuam recebendo horas — renovação não atualizada no Ekyte (ou apontamento em projeto vencido). O campo expired: true marca esses casos: o pacote continua válido (a comparação de consumo vale), mas o registro precisa ser corrigido no Ekyte. Ex. real: Visagio terminou em 19/12/2025 e ainda recebeu horas em julho/2026.
Reconectar o MCP uma vez: o tool é novo. Rode /mcp e reconecte o ekyte-mcp (ou reinicie o Claude Code) para ele aparecer. No mês corrente os números são parciais — sobem até o fim do mês.

05 Verificação de apontamento rodando

Toda semana, medir quem ficou abaixo da meta entre os colaboradores Mukutu e avisar você. Critério = o semáforo (ver §01). Cobrança não sai daqui — o processo prepara e para; quem manda é você.

Deixou de ser diário, e a razão é medida. O plano original desta seção era uma varredura todo dia útil. Virou semanal com duas cadências porque a janela de lançamento tardio do Ekyte é [d-1, d+4]: a quinta-feira de uma semana só fecha na segunda seguinte. Medir antes disso lê número que ainda vai mudar.

O processo não mora mais aqui. Ele é um workflow versionado no repositório mkt_central, em workflows/02_operations/Z99_verificacao_apontamento/. Até 20/08/2026 era uma skill em claude-projects/ekyte/.claude/skills/, disparada por tarefa agendada — funcionava e entregava, mas aquela pasta não é git: mudar o limiar de 6h ou o roster não deixava rastro de quem mudou nem contra qual argumento.

A

Sexta, 9h — a rodada rodando

Lê os dias já fechados da semana, monta o dashboard e manda o resumo para o espaço privado da Ana no Google Chat (webhook cifrado; e-mail foi descartado). Os rascunhos de cobrança ficam prontos e param ali.

B

Segunda, 9h — a medição em teste

Última manhã em que ainda dá para ver se alguma hora subiu depois da cobrança de sexta. Não manda mensagem nenhuma: o resultado entra na abertura do resumo da sexta seguinte.

Primeira execução real em 24/08/2026: zero. Dos 7 cobrados na semana de 17–20/08, nenhum lançou retroativo. A regra combinada é dois zeros seguidos e esta cadência é apagada em vez de seguir rodando às cegas — este foi o primeiro. A próxima medição é 31/08.

O roster é uma lista, não uma dedução

Quem deveria aparecer vem de references/roster_mukutu.md, escrito à mão. Derivar o roster de quem apontou nos últimos 30 dias — que é o que o ekyte-mcp faz para o semáforo — foi descartado aqui: esconde exatamente a pessoa que o processo procura. Ausência do Ekyte é zero, nunca omissão.

Decisões fechadas

  1. Meta: 6h/dia para todo o time, sem exceções. A pergunta sobre meio-período foi fechada assim.
  2. Escopo: roster explícito em references/roster_mukutu.md, com as ausências marcadas nele mesmo.
  3. Onde roda: tarefa agendada local. Cowork e nuvem seguem anotados, não feitos.
  4. Aviso: Google Chat, espaço privado da Ana.
  5. Nenhuma cobrança automática. Nem para a pessoa, nem para terceiros, nem com portão de confirmação — o custo de uma mensagem errada dirigida a alguém não se desfaz.

O que foi tentado e descartado

Fica registrado para não ser reproposto: publicar a lista nomeada no espaço do time (escolhido em 20/08 e revertido na primeira run, quando a mensagem real ficou pronta — mostrar um placar é diferente de expor quem não apontou na frente de todos); cobrar quem ficou abaixo de 6h em qualquer dia (medido: pegava 12 de 15 pessoas, três delas fechando a semana acima da meta — o caminho conhecido para o aviso virar ruído); cobrar só reincidente (deixaria a primeira falha passar em silêncio, e a janela de lançamento tardio fecha antes); e medir o efeito na sexta seguinte (leria sempre zero, porque a janela já fechou).

O que ainda está aberto

  1. A rodada automática de sexta deixa pasta de run? Em 21/08 o agendador marcou 9h33 e a única pasta é de 8h33 — ou o carimbo está uma hora atrás, ou o disparo rodou calado. 28/08 fecha o assunto, comparando o carimbo da pasta nova. Cuidado: lastRunAt é sinal fraco (numa execução mudou, na outra não).
  2. A cadência B se paga? Segundo zero seguido em 31/08 e ela é apagada.
  3. Falta guarda contra mensagem repetida que nomeia gente. Hoje não dói — nada é enviado a ninguém. Passa a doer no dia em que a cobrança sair.
Enquanto nenhuma das duas cadências fechar um ciclo verificável, o workflow segue com o prefixo Z99_, que é como o mkt_central marca o que ainda não provou cadência.

06 Notas técnicas

Onde o código mora

O código foi trazido via git worktree (detached em origin/main) para …\manager-genesis\mukutu-mono-main, sem tocar no branch de trabalho feat/espelho-kv2-redesign.

Fragilidade do worktree: a CLI (via shim ~/.local/bin/muk-ekyte.cmd) e o MCP apontam por caminho absoluto para mukutu-mono-main. Se esse worktree for removido, as duas superfícies quebram. Para atualizar o código: git -C mukutu-mono-main fetch && git checkout origin/main e recompilar a CLI (pnpm run build:cli).

Datas e fuso

O "hoje" usa o fuso America/São Paulo (Brasília). As ferramentas MCP (ekyte_*) aceitam datas em dd/mm/aaaa ou ISO AAAA-MM-DD na entrada (mês em mm/aaaa ou AAAA-MM) e sempre retornam dd/mm/aaaa (mês como MM/AAAA). A API do Ekyte é ISO; a conversão fica isolada em src/format.ts. A CLI muk-ekyte (binário já compilado) ainda usa ISO na flag --date e na saída JSON até ser recompilada com esta versão. Ex.: 15/07/2026 = 2026-07-15.

Frescor dos dados (bloco meta)

Toda ferramenta de leitura retorna meta { generated_at, timezone, scope, up_to_date, alert }. Quando up_to_date é false (dia de hoje, mês corrente, data futura ou janela de lançamento tardio de ~4 dias), o alert explica por que o número é provisório — e esse aviso é sempre repassado ao usuário. O sinal viaja dentro da própria resposta, não depende de memória nem de reinício. Lógica em src/format.ts.

Segurança da chave

A EKYTE_API_KEY está guardada como variável de ambiente do usuário (registro HKCU) — fora de qualquer arquivo versionável e fora deste documento. O arquivo em texto puro original foi removido. Para rotacionar: gere nova chave em Ekyte › Minha Empresa › BI e redefina a variável de usuário.

Fontes de dados

Duas camadas, em ordem de prioridade: (1) SurrealDB Mukutu ek_mart_daily — ainda não implantada em produção; (2) API REST do Ekyte /v1.0/time-trackings — o caminho que roda hoje. Só apontamentos com status = 20 (Concluído) contam como "lançado".

Modelo de dados de projetos (manutenção)

O relatório de manutenção (§04) usa /v1.0/projects (nome com o pacote, datas, workspace) e /v1.0/time-trackings (as horas). O consumido é a soma direta dos apontamentos por workspace/projeto (regra puro × misto na §04) — igual à tela “Estatísticas de Apontamento” do Ekyte. Não usa mais o join ctcTaskId → task.projectId, que dependia de um snapshot de tarefas abertas e subestimava o consumo. Lógica em src/maintenance.ts.

07 Cronograma de projeto → PNG novo

Skill crono-proj. Monta o cronograma de um projeto de cliente e gera a imagem que o gestor envia — tabela de datas à esquerda, Gantt à direita, cor separando Mukutu de Cliente. O envio é manual: a skill termina no arquivo.

Como usar

1 · projetoDiga o nome do projeto — ele precisa já existir no Ekyte, é de lá que saem as tarefas.> monta o cronograma do FL Brokers
2 · tarefasA skill lista as tarefas do projeto (abertas e concluídas) e você escolhe quais viram etapa. Canceladas e tarefas contínuas (Gestão e Reunião) ficam de fora.
3 · datasO fim vem do Ekyte; o início você informa (o Ekyte não tem esse campo preenchido). Etapas que no Ekyte são fases dentro de uma tarefa — validação e aprovação do cliente — você digita: nome, início, fim e a etapa anterior.> validação do cliente, 08 a 11/09, depois do desenvolvimento
4 · conferirAntes de gerar imagem nenhuma, ela mostra a tabela de datas pra você aprovar. Só depois sai o PNG.> pode gerar o png

O que dá pra pedir

recortar o inícioComeçar o gráfico numa data específica sem mexer no dado — a barra que vem de antes aparece cortada e a data real segue na tabela.> só exibe a partir de 10/08
editar depoisUm prazo mudou: ela reaproveita o cronograma anterior e mostra o que andou e quantos dias. Cada versão fica salva — o PNG que o cliente já viu não é sobrescrito.> edita o cronograma do FL Brokers: publicação foi pra 30/09
O que a peça mostra — e o que não mostra. Etapa, início, fim e cor. Sem nome de executor e sem horas, porque ela vai pro cliente. O eixo conta dias úteis: fim de semana não ocupa espaço, então etapas separadas só por sábado e domingo aparecem encostadas. Feriado não é tratado — se uma etapa cair em 07/09, a skill avisa e a decisão é sua.
Prazo replanejado. O PNG mostra sempre a data atual, nunca o prazo original — mesmo quando a tarefa já foi remarcada (acontece em ~30% delas). Quem precisa ver o deslizão é você, na tabela de conferência; o cliente recebe o cronograma vigente.

Onde mora: skills/crono-proj/ no mukutu-mono. Cores e fonte vêm do design system (packages/ui) na hora do render, nunca copiadas.

08 MCP oficial do Ekyte vs. o nosso novo

O Ekyte lançou um servidor MCP próprio (developers.ekyte.com/docs/mcp). O que é, e como se encaixa no que já temos.

O que é o MCP oficial

Um servidor MCP remoto, hospedado pelo próprio Ekyte. Não se instala nada: aponta-se o cliente MCP para uma URL com um token pessoal e ganha-se acesso a 65 ferramentas que leem e escrevem dados do Ekyte.

# conexão — token no perfil: avatar › Meu Perfil › Integrações MCP
https://api.ekyte.com/mcp?token=SEU_TOKEN
Authtoken pessoal gerado no perfil; ações ficam logadas como aquele usuário e respeitam as permissões dele. "Gerar URL" invalida o token anterior; "Revogar URL" corta na hora.
CobreTarefas (17), Tickets (13), Projetos (8), Time Tracking, Squads, Usuários, Workspaces, Tags, Canais, Boards/Notas, Workflows, Artefatos (upload de arquivo).
Limiteslista de tarefas ≤ 200, projetos ≤ 75, apontamentos ≤ 400 por chamada. Sem dado entre empresas.

Lado a lado

 MCP oficial (Ekyte)Nosso ekyte-mcp
Onde rodaremoto, hospedado pelo Ekytelocal (stdio no Claude Code + CLI); HTTP gated
Ferramentas656
Leitura / escritae escreve (cria/edita/envia/upload)só leitura (o fill_hours_plan é inerte)
Autenticaçãotoken pessoal (ação logada como o usuário)EKYTE_API_KEY de empresa (BI)
Focoacesso amplo e cru ao Ekyteestreito e opinativo: semáforo, manutenção, relatórios
Regra de negócionenhuma — devolve o dado brutometa/dias úteis, pacote, frescor, datas BR, atribuição puro×misto

Como se encaixa no que temos

Os dois não competem. Nossas 6 ferramentas são uma camada de negócio em cima da API REST do Ekyte — o semáforo 🔴🟡🟢, o consumo de pacote, o frescor. O MCP oficial é a fonte crua. O encaixe natural é o oficial por baixo das nossas ferramentas, não no lugar delas.

Oportunidade nº 1 — fechar a lacuna do join que ainda resta. A manutenção (§04) já largou o join e virou soma direta — resolvido. Mas o ekyte_person_projects (horas por pessoa × projeto) ainda depende do join ctcTaskId → task.projectId, que passa por um snapshot de tarefas abertas e vira um piso (tarefas fechadas somem — cobertura de ~30% a 70% conforme o mês). O MCP oficial tem 17 ferramentas de Tarefas com filtros próprios: vale testar se resolvem tarefa → projeto de forma completa (inclusive fechadas). Se sim, o split por pessoa vira exato.
Oportunidade nº 2 — rodar na nuvem. Sendo hospedado, o MCP oficial dá o caminho que falta pra rodar rotina com o notebook fechado (Claude Code Routines / Cowork) sem subir nosso próprio servidor HTTP (nosso deploy/ está gated) — e elimina a fragilidade do worktree (§06).
Cuidados. (1) O token vai na URL (?token=) e as ações ficam logadas como a pessoa dona do token — pior pra automação (rotação, desligamento) que a chave de empresa. (2) As ferramentas de escrita têm raio de dano grande; nossa postura read-only é mais segura pra rotina sem supervisão. Adotar escrita só atrás de confirmação explícita.
Recomendação. Manter o ekyte-mcp como a camada opinativa (semáforo, manutenção, relatório de cliente/diretoria — lógica nossa). Pilotar as ferramentas de leitura do MCP oficial como fonte, mirando (a) fechar a lacuna do join que ainda resta no ekyte_person_projects e (b) o caminho de nuvem. Escrita fica pra depois, com confirmação.

Obs.: o mono mukutu-mono tem outro MCP, o funnel-mcp ("verify-everything via typed tools" — Dagster/dbt/Postgres do funil/HubSpot). Mesma pegada de ferramentas tipadas, mas de dados de funil, não do Ekyte — não muda com o MCP oficial do Ekyte.


Documento vivo · atualizado em 24/08/2026 · inclui a skill de cronograma (§07) e a comparação com o MCP oficial do Ekyte (§08).