ekyte-mcp

ARQUIVADO 28/08/2026 — vive em archive/2026-08_ekyte-mcp/; o MCP oficial do Ekyte tornou este obsoleto. Ver archive/2026-08_ekyte-mcp/WHY.md.


aliases: [“Ekyte MCP”, “ekyte-mcp”, “muk-ekyte”, “Monitoramento de Apontamentos”] type: resource cluster: tech-ia status: developing created: 2026-07-31 updated: 2026-07-31 tags: [tech, ia, mcp, ekyte, horas, gestao, mukutu, ferramentas]

Ekyte MCP / Ekyte MCP

Servidor MCP + CLI que responde quem lançou e quem não lançou horas no Ekyte, e quanto do pacote mensal de manutenção cada projeto já consumiu. Código canônico: mukutu-mono/apps/ekyte-mcp (privado). Duas superfícies, uma mesma lógica de negócio (src/hours.ts). Fonte: mukutu-mono.

Números deste documento são ilustrativos

Consumo por projeto e nome de cliente são dado comercial e não entram no brain (este site é público). Os exemplos abaixo usam projetos fictícios; o dado real sai da ferramenta, na hora.

O que faz / What it does

Deriva o time automaticamente (quem tem apontamento nos últimos 30 dias — EKYTE_MCP_ROSTER_WINDOW_DAYS), aplica a meta de horas por pessoa e um calendário de dias úteis, e devolve o semáforo 🔴🟡🟢. / Answers who logged hours and who didn’t.

O semáforo: soma as horas de apontamentos Concluídos (status 20) cujo dia de trabalho é a data avaliada, dentro do escopo. Então:

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

Meta: por pessoa, em config/thresholds.json — hoje 6h para todo o time, sem exceções. Ajustar alguém para meio-período (4h) é editar esse arquivo, sem tocar 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” (src/workday.ts + config/holidays.json); fuso America/São_Paulo.

As duas superfícies / The two surfaces

CLI muk-ekyte — saída em tabela colorida no terminal, JSON quando redirecionada (para jq, scripts):

muk-ekyte hours                                    # time todo, hoje — 🔴🟡🟢
muk-ekyte hours --status red,yellow                # só quem está devendo horas
muk-ekyte hours --workspace muk --status red,yellow  # escopo Mukutu
muk-ekyte hours --date 2026-07-15 --format json | jq '.people'
muk-ekyte person "Nome" --period 14                # histórico de 14 dias

MCP ekyte-mcp no Claude Code — registrado no escopo user (vale em todos os projetos). Pergunta em linguagem natural: “quem não lançou horas hoje?”, “status de horas do time em 15/07/2026”, “quem está vermelho ou amarelo no escopo mukutu?”, “status das manutenções deste mês”.

As 6 ferramentas / The 6 tools

FerramentaPergunta que responde
ekyte_hours_status(date?)Time inteiro num dia: horas lançadas vs. meta, com semáforo.
ekyte_missing(date?)Só quem ficou abaixo da meta naquele dia (🔴 + 🟡).
ekyte_person(name, period_days?)Histórico dia a dia de uma pessoa numa janela recente.
ekyte_maintenance_status(month?, workspace?, match?)Por projeto de manutenção: horas do mês vs. o pacote mensal lido do nome do projeto.
ekyte_person_projects(name, month?)De uma pessoa: horas por projeto no mês, em 3 baldes transparentes (cliente / interno Mukutu / não-mapeado).
ekyte_fill_hours_plan(entries)Caminho de escrita (preencher horas) — inerte por design: devolve um plano, nunca escreve.

O artefato de uso interno (“Ekyte · Monitoramento de Apontamentos”, 24/07/2026) documenta 5 dessas ferramentas — ekyte_person_projects entrou depois e está no origin/main.

Escopo Mukutu / Mukutu scope

Use --workspace muk. O substring muk casa os ~35 workspaces Mukutu* (incluindo os “Mukutu - Cliente”) e 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. Manutenção semanal: revarrer /workspaces da API e conferir se surgiu workspace Mukutu fora do padrão.

Manutenção: horas do mês vs. pacote / Maintenance packages

Pergunta diferente do semáforo diário: o semáforo é pessoa × dia, este é projeto × mês. Feito para relatório de cliente e diretoria.

  • Pacote — lido do nome do projeto (… - 8h → 8h/mês, regex /(\d+)\s*h\b/). Projeto sem Nh no nome vem como no_package.
  • Consumido — soma das horas do mês pelo join apontamento → tarefa → projeto (ctcTaskId → task.projectId).
  • Statusover (estourou o pacote) · ok (dentro) · unused (0h no mês) · no_package.

Exemplo de formato do retorno (projetos fictícios):

ProjetoPacote/mêsConsumido%Status
Cliente A · Manutenção8h5,0h63%ok
Cliente B · Manutenção12h4,8h40%ok
Cliente C · Manutenção20h24,2h121%over
Cliente D · Manutenção8h0h0%unused

O retorno completo traz ainda remaining_hours, end_date, expired, summary (contagem por status) e coverage.

O consumido é um piso, não um teto

O Ekyte não liga o apontamento ao projeto diretamente, e /v1.0/tasks só expõe um snapshot de tarefas abertas/recentes — horas lançadas em tarefas já arquivadas podem não entrar. Por isso o retorno traz coverage.mapped_pct (quanto do mês foi atribuído a algum projeto). Manutenção mapeia bem (tarefas recentes); o não-mapeado é sobretudo trabalho interno e campanhas grandes.

Flag expired: vários projetos de manutenção têm data de término no passado e continuam recebendo horas — renovação não atualizada no Ekyte. O campo marca o caso sem somar nada silenciosamente: o pacote continua válido (a comparação de consumo vale), mas o registro precisa ser corrigido no Ekyte.

ekyte_person_projects nunca devolve um número só: o split cliente × interno é heurística sobre o título da tarefa e pode errar, então vem como balde sinalizado e jamais é somado ao total de cliente.

O frescor viaja dentro da resposta

Toda ferramenta de leitura retorna meta { generated_at, timezone, scope, up_to_date, alert }. Quando up_to_date = false (hoje ainda aberto, mês em andamento, data futura ou janela de lançamento tardio), o alert explica por que o número é provisório — e o aviso é sempre repassado a quem perguntou. O sinal não depende de memória nem de reinício: é a correção durável para “estou olhando dado parcial?”. Lógica em src/format.ts.

Datas: as ferramentas MCP aceitam dd/mm/aaaa ou ISO AAAA-MM-DD (mês mm/aaaa ou AAAA-MM) e sempre retornam dd/mm/aaaa. A CLI ainda usa ISO na flag --date e na saída JSON até ser recompilada.

Escrita de horas: inerte por design / Write path

ekyte_fill_hours_plan é a costura para preencher horas — a API REST do Ekyte é GET-only, então escrever de verdade significa dirigir a UI web via browser (pydoll). A v1 entrega a ferramenta deliberadamente inerte: valida e devolve {status: "plan_only", items, note}, sem abrir browser nem escrever, mesmo se pedirem. executePlan() em src/pydoll-fill.ts é a costura vazia — quando for implementada, tem de continuar suggest-confirm e nunca virar loop de escrita desassistida. Apontamento fabricado ou errado é risco real (cobrança errada, sinal de performance errado).

Fontes de dados / Data sources

Duas camadas, em ordem de prioridade: (1) SurrealDB Mukutu ek_mart_dailyainda não implantada em produção; (2) API REST do Ekyte /v1.0/time-trackings — o caminho que roda hoje. src/surreal.ts degrada para [] em qualquer erro (nunca lança), então o MCP funciona pela API hoje e passa a usar o mart sozinho quando ele subir. O relatório de manutenção usa três endpoints read-only: /v1.0/projects, /v1.0/tasks e /v1.0/time-trackings.

Segurança da chave / Key handling

EKYTE_API_KEY fica como variável de ambiente do usuário (registro HKCU) — fora de arquivo versionável. Nunca commitar. Para rotacionar: gerar nova chave em Ekyte › Minha Empresa › BI e redefinir a variável. O servidor MCP herda a chave no momento em que o Claude Code inicia — mudou a chave ou o tool é novo, reinicie (ou /mcp e reconecte).

Plano de monitoramento diário / Daily monitoring plan

Status: aguardando validação. Todo dia útil, sinalizar quem está 🔴/🟡 no escopo Mukutu, avisar a gestão e depois notificar as próprias pessoas.

  1. Escopo--workspace muk (inclui o “3M”) + revisão semanal de workspaces novos. ✔ definido
  2. Onde roda — começa local agendado (Agendador de Tarefas do Windows ou /loop chamando a CLI). Próximas etapas anotadas: Claude Cowork (tarefa agendada, precisa registrar o MCP no Desktop) e nuvem via Routines (exige subir o ekyte-mcp como servidor HTTP remoto).
  3. Alerta — avaliar o último dia útil, não “hoje”: checar de manhã não mede nada (às 09h quase todo mundo está 🔴 só porque ainda não lançou). Foco em 🔴 e 🟡.
  4. Notificar as pessoas — canal Google Chat, começando em dry-run (só avisa a gestão) antes de acionar terceiros. Nunca virar loop de cobrança automática sem revisão. Liga a Ouvinte do Google Chat.
  5. Em aberto — confirmar meta de 6h/dia para todo o time ou cadastrar exceções (meio-período).

Por que importa para a Nova Mukutu / Why it matters

Perguntas a responder / Questions to answer

  • Meta única de 6h/dia ou exceções por contrato?
  • Quando o ek_mart_daily sobe no SurrealDB (tira a dependência da API REST)?
  • Vale expor ekyte_maintenance_status como relatório recorrente para os gestores de conta?

Fontes / Sources

  • mukutu-mono/apps/ekyte-mcp/README.md + src/ (origin/main, lido em 31/07/2026) — 6 tools registradas.
  • Artefato “Ekyte · Monitoramento de Apontamentos”, 24/07/2026 (documento vivo, 5 tools).