Skip to main content
Glama
FerrazPiai

Ekyte MCP Server

by FerrazPiai

Ekyte MCP Server

Servidor MCP (Model Context Protocol) que permite ao Claude (e outras IAs) interagir com a plataforma Ekyte para gestão de tarefas e apontamento de horas.

Toda a API usada é a interna (https://api.ekyte.com/api/...), autenticada por JWT Bearer (mesmo token que o front app.ekyte.com envia). Não usa a API pública /v1.x.

Autoria: desenvolvido por Pietro Piai com contribuição de Paulo D'Elia, ambos da V4 Ferraz Piai (unidade franqueada da V4 Company). Liberado para qualquer franquia ou pessoa da V4 Company subir sua própria instância.

Repositório: https://github.com/FerrazPiai/ekyte_mcp_server


Sumário


Related MCP server: EverHour MCP Server

Pré-requisitos

Antes de começar, tenha em mãos:

  • Conta ativa no Ekyte com acesso a app.ekyte.com (para extrair o JWT e o company_id).

  • Um dos cenários de deploy:

    • Easypanel rodando num VPS (Hostinger, DigitalOcean, Hetzner, etc.) — caminho recomendado.

    • Ou qualquer servidor com Docker (Ubuntu/Debian + Docker + Docker Compose).

    • Ou apenas máquina local com Node 18+ (se quiser usar só no Claude Desktop em stdio, sem deploy).

  • Conta Claude (Claude Code CLI ou Claude Desktop) onde a MCP será conectada.

  • Conta no GitHub (para fazer fork do repositório — opcional mas recomendado, facilita atualizações futuras).


Instalação rápida via PRD (recomendado)

O repo inclui o arquivo PRD-INSTALACAO-MCP-EKYTE.md — um PRD (Product Requirements Document) pronto para o Claude Code executar a instalação sozinho, do zero ao smoke test. É o caminho mais rápido se você já tem Claude Code instalado e só quer "ligar" a MCP.

Como usar:

  1. Clone o repo:

    git clone https://github.com/FerrazPiai/ekyte_mcp_server.git
    cd ekyte_mcp_server
  2. Abra o Claude Code dentro dessa pasta:

    claude
  3. Mande o Claude executar o PRD:

    Executa este PRD de instalação: @PRD-INSTALACAO-MCP-EKYTE.md

O Claude vai guiar você por:

  • Obter o EKYTE_BEARER_TOKEN e EKYTE_COMPANY_ID (instruções passo-a-passo no DevTools)

  • Instalar dependências e buildar (npm install && npm run build), quando for modo local

  • Registrar a MCP no Claude Code em um dos dois modos:

    • 3A — Stdio local: a MCP roda na sua máquina (precisa de Node 18+ e credenciais locais)

    • 3B — HTTP remoto: aponta para um servidor já hospedado (EasyPanel, Coolify, Railway, etc.) — zero setup local

  • Validar com smoke test (claude mcp list + pedir uma listagem de workspaces no chat)

O PRD inclui troubleshooting para os erros comuns (401, 500, build falhou, MCP não aparece em claude mcp list). Se algo quebrar durante a instalação, é só pedir "resolve pelo troubleshooting do PRD".

Se preferir fazer manualmente (sem o PRD), as seções abaixo cobrem cada parte isolada: ConfiguraçãoDeployConexão com o Claude.


Tools Disponíveis

Leitura (read-only)

Tool

Descrição

ekyte_list_workspaces

Lista workspaces (clientes) da empresa

ekyte_list_users

Lista usuários/membros (com UUID)

ekyte_list_task_types

Lista tipos de tarefa (template + workflow_id)

ekyte_list_phases

Lista fases de um workflow (para descobrir phase_id)

ekyte_list_tasks

Lista tarefas com filtros (workspace, status, datas, etc.)

ekyte_list_task_flow_phases

Lista as fases de uma tarefa específica, com executor/datas/esforço POR FASE

ekyte_get_task

Detalhes de uma tarefa específica

ekyte_list_time_entries

Lista apontamentos de horas

Escrita (destrutivo — pede confirmação)

Tool

Descrição

ekyte_create_task

Cria nova tarefa (fase única ou multi-fase, com executor diferente por fase)

ekyte_update_task

Edita campos top-level da tarefa (título, descrição, executor/fase atuais, prioridade)

ekyte_update_phase

Edita uma FASE específica da tarefa (executor, esforço, datas) — sem alterar as outras fases

ekyte_complete_task

Marca tarefa como concluída

ekyte_add_task_comment

Adiciona comentário na timeline

ekyte_create_time_entry_with_task

Aponta horas em tarefa específica

ekyte_create_time_entry_without_task

Aponta horas avulso

ekyte_delete_time_entry

Remove apontamento

Fluxo recomendado para criar uma tarefa

Fase única (simples)

  1. ekyte_list_workspacesworkspace_id

  2. ekyte_list_task_typestask_type_id (+ workflow_id associado)

  3. ekyte_list_phases(workflow_id)phase_id inicial

  4. ekyte_list_usersexecutor_id (UUID)

  5. ekyte_create_task com os 4 IDs + datas + tempo estimado

Multi-fase (executor diferente por fase)

1–3 iguais ao fluxo acima (listar workspaces, task types, phases) 4. ekyte_list_users → descobrir UUIDs dos responsáveis 5. ekyte_create_task passando o array phases:

{
  "title": "Campanha X",
  "workspace_id": 12345,
  "task_type_id": 67890,
  "phase_start_date": "2026-04-22",
  "phase_due_date": "2026-04-30",
  "phases": [
    {"phase_id": 111, "executor_id": "00000000-0000-0000-0000-000000000001", "effort_minutes": 60, "phase_due_date": "2026-04-24"},
    {"phase_id": 222, "executor_id": "00000000-0000-0000-0000-000000000002", "effort_minutes": 90, "phase_due_date": "2026-04-27"},
    {"phase_id": 333, "executor_id": "00000000-0000-0000-0000-000000000003", "effort_minutes": 30, "phase_due_date": "2026-04-30"}
  ]
}

A tarefa começa na primeira fase da lista. Top-level (executor_id, phase_id) são ignorados.

Fluxo recomendado para editar uma tarefa

Editar campos gerais (fase atual, título, prioridade, etc.)

  • Use ekyte_update_task

  • Campos: title, description, executor_id (fase atual), phase_id (muda a fase ativa), phase_start_date, phase_due_date, priority_group (35=Baixa, 50=Média, 60=Alta, 90=Urgente)

Editar uma fase específica (não-atual) — trocar quem faz o quê

  1. ekyte_list_task_flow_phases(task_id) → ver todas as fases e seus phase_id

  2. ekyte_update_phase(task_id, phase_id, executor_id=..., effort_minutes=..., phase_start_date=..., phase_due_date=...)

  • Ex: "mudar o responsável pela fase Execução da tarefa #123" sem mexer nas outras

Configuração

Variáveis de ambiente

EKYTE_BEARER_TOKEN=seu_jwt_aqui        # obrigatório
EKYTE_COMPANY_ID=1234                  # obrigatório (numérico)
TRANSPORT=http                         # "http" p/ servidor remoto, "stdio" p/ Claude Desktop local
PORT=3000                              # porta HTTP (default 3000)

Como extrair o EKYTE_BEARER_TOKEN (passo-a-passo)

  1. Entre em https://app.ekyte.com com sua conta e faça login.

  2. Abra o DevTools do navegador (F12 no Chrome/Edge, ou Ctrl+Shift+I).

  3. Vá na aba Network (Rede).

  4. Clique em qualquer tela do Ekyte (lista de tarefas, workspaces etc.) para gerar tráfego.

  5. Filtre as requisições por api.ekyte.com — clique em qualquer uma delas.

  6. Na aba HeadersRequest Headers, localize a linha:

    Authorization: Bearer eyJhbGciOi...<string longa>
  7. Copie só o que vem depois de Bearer — esse é o valor de EKYTE_BEARER_TOKEN.

⚠️ Validade: o JWT do Ekyte expira em ~6 meses. Quando o MCP começar a retornar erro 401 Unauthorized, repita o processo e atualize a variável no Easypanel (ou no .env local).

Como descobrir o EKYTE_COMPANY_ID

Na mesma aba Network do DevTools, observe a URL das requisições para api.ekyte.com. Elas têm o formato:

https://api.ekyte.com/api/companies/1234/workspaces
                                   ^^^^
                                   esse é o company_id

O número que aparece depois de /companies/ é o seu EKYTE_COMPANY_ID. Cada unidade/empresa tem o seu — use o da sua unidade, não copie o de outro time.

Deploy

Esta MCP é um container Docker (Node 20-alpine) que expõe HTTP na porta 3000. Qualquer plataforma que aceite Dockerfile + domínio HTTPS funciona. Clique na plataforma que você usa para ir direto ao passo-a-passo:

Easypanel

Coolify

Railway

Render

Fly.io

VPS genérico

Self-hosted, painel visual, SSL automático — stack original do projeto

Self-hosted open-source, alternativa direta ao Easypanel

Cloud gerenciado, deploy em 2min via GitHub, ~$5/mês

Cloud gerenciado, plano Free (com sleep) ou Starter $7/mês

Edge global, deploy por CLI, ótimo para latência distribuída

Ubuntu + Docker Compose + Nginx + Certbot (qualquer VPS)

Easypanel

O Easypanel faz o build do Dockerfile, configura SSL automático (Let's Encrypt) e injeta as env vars. Fluxo completo:

1. Fork do repositório (recomendado)

Acesse https://github.com/FerrazPiai/ekyte_mcp_server e clique em Fork para copiar o repo para sua conta. Isso permite puxar atualizações futuras com um clique, sem perder seu histórico.

Alternativa: use o repositório original direto, mas você não terá controle sobre atualizações.

2. Criar o serviço no Easypanel

  1. Entre no painel do seu Easypanel → selecione o projeto onde quer rodar o MCP (ou crie um novo).

  2. Clique em + ServiceApp.

  3. Dê um nome ao serviço, por exemplo ekyte-mcp.

  4. Na aba Source:

    • Type: GitHub (ou Git genérico)

    • Repository: https://github.com/SEU-USUARIO/ekyte_mcp_server (ou o original se não fez fork)

    • Branch: main

    • Build Path: / (raiz)

  5. Na aba Build:

    • Type: Dockerfile

    • Dockerfile Path: Dockerfile (já existe na raiz)

3. Configurar as variáveis de ambiente

Na aba Environment do serviço, adicione:

EKYTE_BEARER_TOKEN=eyJhbGciOi...          # seu JWT extraído do DevTools
EKYTE_COMPANY_ID=1234                     # o ID da sua unidade
TRANSPORT=http
PORT=3000
NODE_ENV=production

Salve e clique em Deploy.

4. Expor a porta e configurar o domínio

  1. Na aba Domains do serviço, clique em + Add Domain.

  2. Host: ekyte-mcp.seu-dominio.com (use um subdomínio que aponte para o IP do Easypanel).

  3. Path: /

  4. Port: 3000

  5. Marque HTTPS (o Easypanel cuida do Let's Encrypt).

  6. Salve — em ~30s o SSL é emitido.

5. Configurar healthcheck (opcional, mas recomendado)

Na aba DeployHealth Check:

  • Path: /health

  • Port: 3000

  • Interval: 30s

⚠️ Não adicione HEALTHCHECK no Dockerfile — deixe o Easypanel cuidar disso via HTTP probe. O Dockerfile já está configurado assim de propósito.

6. Verificar se subiu

curl https://ekyte-mcp.seu-dominio.com/health
# resposta esperada:
# {"status":"ok","server":"ekyte-mcp-server","version":"1.0.0"}

Endpoint MCP final: https://ekyte-mcp.seu-dominio.com/mcp

7. Atualizar depois de mudanças no código

  • Se fez fork: faça git pull do upstream no seu fork → Easypanel detecta e rebuilda automaticamente (se tiver auto-deploy ligado) ou clique em Deploy manual.

  • Trocar o JWT expirado: só editar EKYTE_BEARER_TOKEN em EnvironmentDeploy → pronto.

Coolify

Coolify é uma PaaS open-source e self-hosted, alternativa direta ao Heroku, Vercel ou Netlify — ótima opção se você quer rodar o MCP server na sua própria infra com SSL automático, deploy via Git e zero vendor lock-in.

Pré-requisitos

  • Instância do Coolify v4 rodando (veja coolify.io/docs)

  • Servidor com Docker instalado e gerenciado pelo Coolify (pode ser o próprio host do Coolify ou um remoto via SSH)

  • Domínio ou subdomínio apontando para o IP do servidor (ex: mcp.seudominio.com.br com registro A)

Passo-a-passo

  1. Criar o projeto e a aplicação

    • No dashboard do Coolify, entre em um Project existente (ou crie um novo) e clique em + New Resource

    • Escolha Public Repository (ou Private Repository (with GitHub App) se preferir receber webhooks de push)

    • Cole a URL: https://github.com/FerrazPiai/ekyte_mcp_server

  2. Configurar branch e build pack

    • Branch: main

    • Build Pack: Dockerfile (o Coolify detecta automaticamente o Dockerfile na raiz — não precisa informar caminho customizado)

    • Base Directory: / (padrão)

  3. Configurar porta e rede

    • Em General > Network, defina Ports Exposes como 3000

    • Deixe Ports Mappings vazio (o Coolify gerencia via proxy Traefik interno)

    ⚠️ O Coolify só roteia tráfego para portas declaradas em EXPOSE no Dockerfile. O Dockerfile deste projeto já faz EXPOSE 3000.

  4. Adicionar variáveis de ambiente

    • Vá em Environment Variables e adicione as 5 variáveis obrigatórias:

    EKYTE_BEARER_TOKEN=seu_jwt_longo_aqui
    EKYTE_COMPANY_ID=123
    TRANSPORT=http
    PORT=3000
    NODE_ENV=production
    • Marque EKYTE_BEARER_TOKEN como Is Secret? para mascarar o valor nos logs e na UI

  5. Configurar domínio e SSL

    • Em General > Domains, informe a URL completa com https://, por exemplo: https://mcp.seudominio.com.br

    • O Coolify emite e renova o certificado Let's Encrypt automaticamente via Traefik — não precisa configurar nada além do domínio

    • Deixe Force HTTPS Redirect ativado

  6. Configurar healthcheck

    • Em Healthchecks, ative Enabled

    • Path: /healthPort: 3000Method: GET

    • Interval: 30Timeout: 10Retries: 3

  7. Deploy

    • Clique em Deploy no topo da tela

    • Acompanhe os logs em Deployments > Logs; o primeiro build leva 1-2 min

Verificação

curl https://mcp.seudominio.com.br/health
# {"status":"ok","server":"ekyte-mcp-server","version":"1.0.0"}

Endpoint MCP final: https://mcp.seudominio.com.br/mcp

Atualizações futuras

  • Automático (recomendado): em Webhooks, copie a URL gerada pelo Coolify e cole em Settings > Webhooks do repositório no GitHub (evento: push). Todo git push na branch main dispara redeploy.

  • Manual: clique em Redeploy no topo da página da aplicação a qualquer momento.

⚠️ Se você trocar o EKYTE_BEARER_TOKEN, o Coolify não reinicia o container sozinho — clique em Restart ou Redeploy para aplicar a nova env var.

Railway

A Railway é uma plataforma cloud PaaS que faz deploy direto do GitHub em ~2 minutos, com HTTPS automático em domínios *.up.railway.app. O plano Trial oferece $5 de crédito único para testar, e o plano Hobby custa $5/mês com recursos suficientes para rodar este MCP server 24/7.

⚠️ O plano Trial expira quando os $5 acabam. Para produção contínua, migre para o Hobby ($5/mês) — senão o Claude perde acesso quando o serviço for suspenso.

Pré-requisitos

  • Conta na Railway (railway.com) — pode logar com GitHub

  • Repositório ekyte_mcp_server no GitHub (recomendado fazer fork de FerrazPiai/ekyte_mcp_server para controlar quando redeployar)

  • Token Ekyte (EKYTE_BEARER_TOKEN) e ID da empresa (EKYTE_COMPANY_ID) em mãos

Passo-a-passo (via UI web)

  1. Logue em railway.com e clique em New Project no canto superior direito do dashboard.

  2. Selecione Deploy from GitHub repo. Se for a primeira vez, autorize a Railway a acessar sua conta GitHub (pode limitar a apenas o repositório ekyte_mcp_server em Only select repositories).

  3. Escolha o repositório ekyte_mcp_server (seu fork ou o original). A Railway detecta automaticamente o Dockerfile na raiz e inicia o build — não precisa configurar buildpack.

  4. Enquanto o primeiro build roda, clique no serviço recém-criado e abra a aba Variables. Clique em Raw Editor no canto superior direito e cole o bloco abaixo, substituindo os valores:

    EKYTE_BEARER_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.seu-jwt-completo-aqui
    EKYTE_COMPANY_ID=12345
    TRANSPORT=http
    PORT=3000
    NODE_ENV=production

    Clique em Update Variables. A Railway faz um novo deploy automaticamente com as variáveis aplicadas.

    ⚠️ Nunca commite o EKYTE_BEARER_TOKEN no repositório. Use sempre as Variables da Railway.

  5. Vá em Settings → Networking e clique em Generate Domain. A Railway cria um domínio público do tipo ekyte-mcp-production-xxxx.up.railway.app com HTTPS via Let's Encrypt já configurado. Confirme a porta 3000 quando solicitado.

  6. (Opcional) Custom Domain: ainda em Settings → Networking, clique em Custom Domain, informe seu domínio (ex: mcp.seudominio.com) e crie um registro CNAME no seu DNS apontando para o target fornecido pela Railway. O certificado TLS é emitido em ~1 minuto após a propagação.

  7. (Opcional) Healthcheck: em Settings → Deploy, no campo Healthcheck Path, coloque /health. Isso faz a Railway aguardar o endpoint responder 200 antes de marcar o deploy como saudável — evita downtime em redeploys.

Verificação

curl https://ekyte-mcp-production-xxxx.up.railway.app/health
# {"status":"ok","server":"ekyte-mcp-server","version":"1.0.0"}

Endpoint MCP final: https://ekyte-mcp-production-xxxx.up.railway.app/mcp

Atualizações automáticas

Todo git push no branch main do repositório conectado dispara um novo build e deploy automaticamente — sem configuração adicional. Acompanhe em tempo real na aba Deployments do serviço. Para pausar, desative Auto Deploy em Settings → Source.

Alternativa: deploy via CLI

Se preferir linha de comando ao invés da UI web:

npm i -g @railway/cli
railway login                          # abre o browser para autenticar
railway init                           # cria projeto vinculado à pasta atual
railway up                             # envia o código e builda usando o Dockerfile
railway variables --set "EKYTE_BEARER_TOKEN=eyJ..." --set "EKYTE_COMPANY_ID=12345" \
                  --set "TRANSPORT=http" --set "PORT=3000" --set "NODE_ENV=production"
railway domain                         # gera o domínio público *.up.railway.app

Render

Render é uma PaaS gerenciada que faz deploy direto do GitHub, com plano Free (dorme após 15min de inatividade) e domínio *.onrender.com grátis já com HTTPS/TLS automático — ideal para expor o MCP server ao Claude sem configurar proxy reverso.

Pré-requisitos

Passo-a-passo (via dashboard)

  1. No dashboard do Render, clique em + New (canto superior direito) → Web Service.

  2. Em Source Code, selecione GitHub e autorize o Render a acessar o repositório ekyte_mcp_server. Clique em Connect ao lado do repo.

  3. Na tela de configuração, preencha:

    • Name: ekyte-mcp (será usado no subdomínio: ekyte-mcp.onrender.com)

    • Project: deixe em branco ou crie um novo (ex: MCP Servers)

    • Language: Docker (o Render detecta automaticamente o Dockerfile na raiz)

    • Branch: main

    • Region: Oregon (US West) ou Frankfurt (EU) — escolha a mais próxima dos usuários. No momento não há região brasileira; Oregon costuma ter latência aceitável a partir do Brasil.

    • Dockerfile Path: ./Dockerfile (padrão)

    • Instance Type: Free para testes ou Starter ($7/mês) para uso contínuo sem sleep

  4. Role até a seção Environment Variables e clique em Add Environment Variable para cada uma das variáveis abaixo:

    EKYTE_BEARER_TOKEN=seu_jwt_longo_aqui
    EKYTE_COMPANY_ID=12345
    TRANSPORT=http
    PORT=3000
    NODE_ENV=production

    ⚠️ Nunca commite esses valores no repositório. O Render criptografa env vars em repouso e só as expõe ao container em runtime.

  5. Expanda Advanced e configure:

    • Health Check Path: /health (o Render vai fazer polling neste endpoint e reiniciar o serviço se falhar)

    • Auto-Deploy: Yes (padrão — cada git push na branch main dispara um novo deploy)

  6. Clique em Deploy Web Service no final da página. O primeiro build leva cerca de 3-5 minutos.

Verificação

curl https://ekyte-mcp.onrender.com/health
# {"status":"ok","server":"ekyte-mcp-server","version":"1.0.0"}

Endpoint MCP final: https://ekyte-mcp.onrender.com/mcp

Atualizações

Com auto-deploy ativo, basta git push origin main — o Render detecta o commit, rebuilda a imagem Docker e faz rollout com zero-downtime. Acompanhe os logs em tempo real na aba Logs e faça rollback pela aba Events.

⚠️ Atenção ao plano Free: o serviço entra em sleep após 15 minutos sem requests. A primeira chamada após o sleep leva ~30 segundos para acordar o container, o que frequentemente excede o timeout do Claude ao conectar ao MCP. Para uso contínuo/produção, escolha:

  • Fazer upgrade para Starter ($7/mês) — sem sleep, 512MB RAM, sempre ativo

  • Configurar keep-alive externo (ex: cron-job.org ou UptimeRobot) fazendo GET /health a cada 10 minutos — funciona mas pode ser bloqueado pelo Render

  • Usar outro provider (Railway, Fly.io) se o Starter for proibitivo

Fly.io

Fly.io é uma plataforma edge global que roda containers próximos aos usuários em dezenas de regiões. O deploy é feito inteiramente via CLI (flyctl), o que torna o fluxo simples e reproduzível — ideal para MCP servers que atendem clientes distribuídos. Todo app recebe automaticamente um domínio *.fly.dev com HTTPS gerenciado (Let's Encrypt).

Pré-requisitos

  • Conta no Fly.io (cadastro com GitHub ou email)

  • Cartão de crédito cadastrado (obrigatório mesmo no tier gratuito — há limite de 3 VMs shared-cpu-1x pequenas grátis)

  • CLI flyctl instalada localmente

  • Git instalado

Passo 1 — Instalar o flyctl

Windows (PowerShell):

pwsh -Command "iwr https://fly.io/install.ps1 -useb | iex"

macOS / Linux:

curl -L https://fly.io/install.sh | sh

Valide a instalação:

fly version

Passo 2 — Fazer login

fly auth login

Um navegador será aberto para autenticação. Após o login, o token fica salvo localmente.

Passo 3 — Clonar o repositório

git clone https://github.com/FerrazPiai/ekyte_mcp_server.git
cd ekyte_mcp_server

Passo 4 — Inicializar o app com fly launch

O comando abaixo detecta o Dockerfile existente e gera um fly.toml inicial, sem fazer deploy ainda (vamos ajustar configs antes):

fly launch --no-deploy

Responda às perguntas interativas:

  • App name: escolha algo único, ex: ekyte-mcp-seunome

  • Region: escolha a mais próxima (ex: gru para São Paulo, gig para Rio)

  • Postgres / Redis / Sentry: responda No para todos

  • Deploy now: responda No

Passo 5 — Ajustar o fly.toml

Abra o fly.toml gerado e garanta que ele tenha as seções abaixo. Exemplo mínimo pronto para copiar:

# fly.toml — configuração do MCP server Ekyte
app = "ekyte-mcp-seunome"
primary_region = "gru"

[build]
  # usa o Dockerfile multi-stage da raiz
  dockerfile = "Dockerfile"

[env]
  # variáveis NÃO sensíveis — ficam visíveis no dashboard
  TRANSPORT = "http"
  PORT = "3000"
  NODE_ENV = "production"

[http_service]
  internal_port = 3000        # porta exposta pelo container
  force_https = true          # redireciona HTTP -> HTTPS automaticamente
  auto_stop_machines = "stop" # economia: para a VM quando ociosa
  auto_start_machines = true  # religa na próxima request
  min_machines_running = 0

  [[http_service.checks]]
    grace_period = "10s"
    interval = "30s"
    method = "GET"
    timeout = "5s"
    path = "/health"

[[vm]]
  cpu_kind = "shared"
  cpus = 1
  memory_mb = 512

⚠️ Atenção ao internal_port: ele deve bater com a porta em que o app escuta dentro do container (3000). Se divergir, o Fly não consegue rotear requests e o healthcheck falha.

Passo 6 — Configurar os secrets (vars sensíveis)

No Fly, há duas formas de passar variáveis de ambiente para o container:

  • [env] no fly.toml — valores em texto plano, visíveis no dashboard e no repo. Use para configs públicas (TRANSPORT, PORT, NODE_ENV).

  • Secrets (fly secrets set) — valores criptografados em repouso, injetados como env vars em runtime mas nunca expostos. Use para tokens, chaves de API, credenciais.

O EKYTE_BEARER_TOKEN é um JWT longo com acesso à API Ekyte — sempre como secret:

fly secrets set \
  EKYTE_BEARER_TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
  EKYTE_COMPANY_ID=1234

⚠️ Nunca commite o EKYTE_BEARER_TOKEN no fly.toml nem em arquivos .env versionados. Secrets do Fly são o canal correto.

Confira os secrets cadastrados (o Fly mostra apenas o hash, nunca o valor):

fly secrets list

Passo 7 — Fazer o deploy

fly deploy

O Fly vai: subir o contexto do build → construir a imagem Docker remotamente → provisionar uma VM na região escolhida → rodar o healthcheck em /health → liberar tráfego quando o check passar.

Ao final, a URL aparece no log (algo como https://ekyte-mcp-seunome.fly.dev).

Passo 8 — Verificar

curl https://ekyte-mcp-seunome.fly.dev/health
# {"status":"ok","server":"ekyte-mcp-server","version":"1.0.0"}

Endpoint MCP final: https://ekyte-mcp-seunome.fly.dev/mcp

Atualizando o app

Sempre que houver mudanças no código:

git pull
fly deploy

O Fly faz rebuild + rolling deploy sem downtime perceptível.

Comandos úteis no dia a dia

fly logs              # tail dos logs em tempo real
fly status            # estado das VMs, região, última release
fly secrets list      # lista (apenas os nomes) dos secrets
fly apps open         # abre o app no navegador
fly ssh console       # abre shell dentro da VM (debug)
fly scale count 2     # escalar para 2 instâncias
fly releases          # histórico de deploys (útil para rollback)

⚠️ Custo: o tier gratuito cobre 3 VMs shared-cpu-1x com 256MB. Com auto_stop_machines = "stop" o app dorme quando ocioso — a primeira request depois disso demora ~1-2s para acordar a VM. Para workloads sempre quentes, setar min_machines_running = 1 e acompanhar a cobrança em fly.io/dashboard/billing.

VPS genérico (Ubuntu + Docker Compose + Nginx)

Caminho "hardcore" mas 100% portátil — funciona em qualquer VPS Ubuntu/Debian (Hostinger VPS, DigitalOcean Droplet, Hetzner Cloud, Contabo, Vultr, AWS Lightsail, etc.). Dá muito mais controle sobre a infra, mas exige configurar Nginx e SSL na mão. Se você quer algo plug-and-play, prefira um painel (Easypanel, Coolify); se quer entender tudo que está rodando, segue o fluxo abaixo.

Pré-requisitos

  • VPS com Ubuntu 22.04+ (ou Debian 11+) e acesso SSH como root ou usuário com sudo

  • Domínio próprio com um A-record apontando para o IP público do VPS (ex: ekyte-mcp.seu-dominio.com203.0.113.42)

  • Portas 22, 80 e 443 liberadas no firewall do provedor (security group / cloud firewall)

⚠️ Em provedores como AWS Lightsail, DigitalOcean e Hetzner, o firewall do painel é independente do UFW do sistema. Libere as portas nos dois lugares, senão o Certbot não consegue validar o domínio.

Passo 1 — Instalar Docker e Docker Compose

curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER

⚠️ Depois de rodar o usermod, saia do SSH (exit) e reconecte — o grupo docker só é aplicado em novas sessões. Sem isso, você vai precisar usar sudo em todo comando docker.

Confira se ficou OK:

docker --version
docker compose version

Passo 2 — Clonar o repositório

git clone https://github.com/FerrazPiai/ekyte_mcp_server.git
cd ekyte_mcp_server

Passo 3 — Criar o arquivo .env

Na raiz do projeto, crie um .env baseado no .env.example:

cp .env.example .env
nano .env

Conteúdo completo:

EKYTE_BEARER_TOKEN=seu_jwt_longo_aqui
EKYTE_COMPANY_ID=12345
TRANSPORT=http
PORT=3000

⚠️ Nunca commite o .env — ele já está no .gitignore. O token JWT da Ekyte dá acesso total à sua conta, trate como senha.

Passo 4 — Subir o container

docker compose up -d --build
docker compose logs -f

Em outra sessão SSH (ou Ctrl+C nos logs), valide que o health check responde localmente:

curl http://localhost:3000/health

Deve retornar {"status":"ok",...}. Se não responder, cheque os logs — normalmente é token inválido ou EKYTE_COMPANY_ID errado.

Passo 5 — Configurar Nginx como reverse proxy

Instale o Nginx:

sudo apt update
sudo apt install nginx -y

Crie o server block:

sudo nano /etc/nginx/sites-available/ekyte-mcp

Cole o conteúdo abaixo (troque ekyte-mcp.seu-dominio.com pelo seu domínio real):

server {
    listen 80;
    listen [::]:80;
    server_name ekyte-mcp.seu-dominio.com;

    client_max_body_size 10M;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;

        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade           $http_upgrade;
        proxy_set_header Connection        "upgrade";

        proxy_connect_timeout 120s;
        proxy_send_timeout    120s;
        proxy_read_timeout    120s;
    }
}

Ative o site, teste a configuração e recarregue o Nginx:

sudo ln -s /etc/nginx/sites-available/ekyte-mcp /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx

⚠️ Os timeouts de 120s são importantes: algumas tools do MCP (como listagens grandes da Ekyte) podem levar mais de 30s. Sem isso, o Nginx corta a conexão antes do Claude receber a resposta.

Passo 6 — SSL com Certbot (Let's Encrypt grátis)

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d ekyte-mcp.seu-dominio.com

O Certbot vai pedir seu e-mail, aceitar os termos e perguntar se quer redirecionar HTTP para HTTPS — responda sim. Ele reescreve o server block automaticamente, adiciona os blocos listen 443 ssl e instala um cron de renovação automática (/etc/cron.d/certbot).

⚠️ Se o A-record do domínio ainda não propagou, o Certbot falha com erro de validação. Confira com dig +short ekyte-mcp.seu-dominio.com antes de rodar — propagação DNS pode levar de 5 minutos a algumas horas.

Passo 7 — Verificar o deploy

curl https://ekyte-mcp.seu-dominio.com/health
# {"status":"ok","server":"ekyte-mcp-server","version":"1.0.0"}

Endpoint MCP final: https://ekyte-mcp.seu-dominio.com/mcp

Passo 8 — Atualizar depois de mudanças no repo

cd ~/ekyte_mcp_server
git pull
docker compose up -d --build

O Nginx e o Certbot continuam funcionando normalmente — só o container Node é recriado.

Dica final — Firewall com UFW

Feche tudo que não é essencial:

sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable

⚠️ Rode o ufw allow 22 antes de habilitar o UFW, senão você se tranca fora do SSH e vai precisar usar o console web do provedor para recuperar o acesso.

Conexão com o Claude

Claude Code (CLI) — transporte HTTP remoto

No diretório do projeto onde você vai usar a MCP, crie .mcp.json:

{
  "mcpServers": {
    "ekyte": {
      "type": "http",
      "url": "https://ekyte-mcp.seu-dominio.com/mcp"
    }
  }
}

Ou no escopo de usuário, via CLI:

claude mcp add --transport http ekyte https://ekyte-mcp.seu-dominio.com/mcp --scope user

Teste: claude mcp list deve mostrar ekyte ✓ connected.

Claude Desktop — transporte stdio local

Rode o servidor em modo stdio (sem HTTP). No claude_desktop_config.json:

{
  "mcpServers": {
    "ekyte": {
      "command": "node",
      "args": ["C:/caminho/para/ekyte-mcp-server/dist/index.js"],
      "env": {
        "EKYTE_BEARER_TOKEN": "seu_jwt",
        "EKYTE_COMPANY_ID": "1234",
        "TRANSPORT": "stdio"
      }
    }
  }
}

Claude Desktop — transporte HTTP remoto (com MCP remoto instalado no EasyPanel)

{
  "mcpServers": {
    "ekyte": {
      "url": "https://ekyte-mcp.seu-dominio.com/mcp"
    }
  }
}

Skill do Claude para operar o Ekyte com segurança

Conectar a MCP só dá ao Claude acesso às tools. Sem contexto adicional, a IA pode chutar IDs de workspace, inventar datas ou criar tarefa no cliente errado — especialmente em operações destrutivas.

O repo inclui uma skill pronta em .claude/skills/ekyte/ que resolve isso: ensina o Claude a sempre listar antes de criar, confirmar todos os dados com o usuário antes de operações destrutivas, usar UUIDs corretos, formato AAAA-MM-DD para datas e filtrar listagens por workspace para performance.

Se você seguiu o PRD de instalação, a skill já foi instalada automaticamente em ~/.claude/skills/ekyte/ junto com a MCP — nada a fazer aqui.

Se instalou a MCP manualmente e quer adicionar a skill depois, a forma mais rápida é pedir no chat do Claude Code:

"Instala a skill do Ekyte seguindo o Passo 5 (Local) ou Passo 3 (Remoto) do PRD-INSTALACAO-MCP-EKYTE.md"

O Claude executa os comandos abaixo automaticamente — essa seção documenta o que ele faz (útil se você preferir rodar manualmente ou auditar antes).

O que a skill garante

  • Nunca cria tarefa sem confirmar: sempre lista workspaces, task types, phases e usuários antes de chamar ekyte_create_task, e valida todos os dados com o usuário.

  • Nunca inventa IDs: executor_id sempre é UUID (ex: 00000000-0000-0000-0000-000000000001), nunca número — a skill lembra disso.

  • Formato de datas correto: AAAA-MM-DD (sem hora), HH:MM para horários, end_time > start_time em apontamentos.

  • Confirmação em operações destrutivas: criar tarefa, completar tarefa, deletar apontamento, apontar horas — tudo pergunta antes de executar.

  • Performance: usa search nas listagens (evita paginar 600+ workspaces), filtra list_tasks por workspace_id, avisa quando listagem pode demorar (10-30s).

  • Sabe a diferença entre ekyte_update_task (fase atual) e ekyte_update_phase (fase específica não-atual) — bug comum quando a IA não tem contexto.

Como instalar a skill (one-liner, sem clonar o repo)

Ideal para quem só usa a MCP via HTTP remoto. Baixa os dois arquivos do GitHub direto para ~/.claude/skills/ekyte/:

Linux / macOS (bash/zsh):

mkdir -p ~/.claude/skills/ekyte && \
  curl -fsSL -o ~/.claude/skills/ekyte/SKILL.md \
    https://raw.githubusercontent.com/FerrazPiai/ekyte_mcp_server/main/.claude/skills/ekyte/SKILL.md && \
  curl -fsSL -o ~/.claude/skills/ekyte/reference.md \
    https://raw.githubusercontent.com/FerrazPiai/ekyte_mcp_server/main/.claude/skills/ekyte/reference.md

Windows (PowerShell):

$dst = "$env:USERPROFILE\.claude\skills\ekyte"
New-Item -ItemType Directory -Force -Path $dst | Out-Null
$base = "https://raw.githubusercontent.com/FerrazPiai/ekyte_mcp_server/main/.claude/skills/ekyte"
Invoke-WebRequest -Uri "$base/SKILL.md"     -OutFile "$dst\SKILL.md"
Invoke-WebRequest -Uri "$base/reference.md" -OutFile "$dst\reference.md"

Pronto — a skill fica disponível em qualquer sessão do Claude Code/Desktop, independente de projeto.

Como instalar a skill (via git clone)

Se você já clonou o repo para fazer deploy local, copiar a skill para o global é instantâneo:

# Linux / macOS
mkdir -p ~/.claude/skills
cp -r .claude/skills/ekyte ~/.claude/skills/

# Windows (PowerShell)
New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\.claude\skills" | Out-Null
Copy-Item -Recurse .claude\skills\ekyte "$env:USERPROFILE\.claude\skills\"

Alternativa sem copiar (per-project): se você abre o Claude Code dentro da pasta do repo, a skill é detectada automaticamente via .claude/skills/ekyte/ — sem precisar instalar no global.

Usando a skill

Depois de instalada, é só pedir em linguagem natural:

"Crie uma tarefa no Ekyte para o cliente X, fase Y, responsável Z" "Quantas horas foram apontadas essa semana no workspace Acme?" "Liste as tarefas ativas do responsável Fulano"

O Claude invoca a skill ekyte automaticamente (Code ou Desktop) e segue o fluxo correto: lista → confirma → executa. Para forçar invocação explícita, use /ekyte <o que quer fazer>.

Atualizando a skill

Quando o repo receber updates no SKILL.md ou reference.md, basta rodar o one-liner (ou git pull + cp -r se instalou via clone) de novo — ele sobrescreve os arquivos locais com a versão mais recente do main.

⚠️ Sem a skill, o Claude pode criar tarefas no workspace errado, chutar UUIDs de usuário ou pular a confirmação em operações destrutivas. Se reinstalar a MCP em outra máquina, reinstale a skill também (o PRD cuida disso automaticamente).

Desenvolvimento local

npm install
npm run build

# Modo stdio (default) — para Claude Desktop
EKYTE_BEARER_TOKEN=xxx EKYTE_COMPANY_ID=1234 npm start

# Modo HTTP — simula o deploy EasyPanel
EKYTE_BEARER_TOKEN=xxx EKYTE_COMPANY_ID=1234 TRANSPORT=http npm start

# Hot reload
npm run dev

Smoke test rápido (HTTP):

curl http://localhost:3000/health
curl -X POST http://localhost:3000/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Arquitetura

src/
├── index.ts               # Entry point (stdio + HTTP streamable)
├── constants.ts           # Base URL, timeouts, limites
├── types.ts               # Tipos do Ekyte
├── services/
│   └── ekyte-client.ts    # Cliente axios + helpers companyUrl / companyV2Url
├── schemas/
│   ├── common.ts          # Schemas Zod compartilhados
│   ├── task.ts            # Schemas de tarefas e fases
│   └── time-entry.ts      # Schemas de apontamentos
└── tools/
    ├── read-tools.ts      # Tools de leitura
    └── write-tools.ts     # Tools de escrita

Endpoints que a MCP usa (referência)

Todos com Authorization: Bearer <jwt> e base https://api.ekyte.com:

Método

Path

Tool

GET

/api/companies/{id}/workspaces

list_workspaces

GET

/api/companies/{id}/users

list_users

GET

/api/companies/{id}/task-types

list_task_types

GET

/api/companies/{id}/workflows/{wf}

list_phases (retorna phases[])

GET

/api/v2/companies/{id}/ctc-tasks

list_tasks

GET

/api/v2/companies/{id}/ctc-tasks/{task}

get_task

GET

/api/v2/companies/{id}/ctc-tasks/{task}/flow-phases

list_task_flow_phases

POST

/api/companies/{id}/ctc-tasks

create_task (suporta flow[] multi-fase)

PATCH

/api/v2/companies/{id}/ctc-tasks/{task}

update_task / complete_task

PATCH

/api/v2/companies/{id}/ctc-tasks/{task}/flow-phase/{phase}

update_phase

POST

/api/v2/companies/{id}/ctc-tasks/{task}/comments

add_task_comment

GET

/api/companies/{id}/time-trackings/data/details

list_time_entries

POST

/api/companies/{id}/workspaces/{ws}/time-trackings

create_time_entry_*

PATCH

/api/companies/{id}/workspaces/{ws}/time-trackings/{id}

delete_time_entry

Available Tools

21 tools
ekyte_add_task_commentAdicionar Comentário em TarefaA

Adiciona um comentário em uma tarefa existente no Ekyte.

Parâmetros obrigatórios:

  • task_id: ID da tarefa (use ekyte_list_tasks para encontrar)

  • comment: Texto do comentário

O comentário será adicionado como uma nova mensagem na timeline da tarefa, visível para todos que têm acesso.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYesID numérico da task no Ekyte. Use ekyte_list_tasks para descobrir o ID.
commentYesTexto do comentário a ser adicionado na tarefa

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate non-read-only and non-destructive behavior. The description adds that the comment appears as a new message in the timeline visible to all, which aligns with annotations. No contradictions. It provides useful context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded with the main action. Headers for parameters improve readability. Minor redundancy with 'Parâmetros obrigatórios:' but overall efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description explains the action and visibility but lacks information about return values or potential errors. Given the simplicity (2 params, no output schema), it is adequate but could be more complete by mentioning what the tool returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds meaning by explaining the effect (added to timeline) and reinforcing the use of ekyte_list_tasks for task_id. This goes beyond schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Adiciona um comentário') and the resource ('em uma tarefa existente no Ekyte'). It distinguishes from sibling tools like ekyte_create_task and ekyte_complete_task by focusing on adding comments.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains that the comment is added to the task timeline and visible to all with access. It also notes mandatory parameters and how to find task_id using ekyte_list_tasks. However, it does not explicitly state when to use this tool versus alternatives, though the context makes it clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ekyte_complete_taskConcluir Tarefa no EkyteA
DestructiveIdempotent

Marca uma tarefa como concluída (situation=30) no Ekyte.

Parâmetro obrigatório:

  • task_id: ID da tarefa a ser concluída (use ekyte_list_tasks para encontrar)

IMPORTANTE: Esta ação marca a tarefa como CONCLUÍDA. Confirme com o usuário antes de executar. Para verificar o status atual da tarefa, use ekyte_get_task primeiro.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYesID numérico da task no Ekyte. Use ekyte_list_tasks para descobrir o ID.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds context beyond annotations by specifying the resulting state (CONCLUÍDA) and confirming it is a state change. Annotations include destructiveHint: true, which aligns; no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with three short paragraphs, each containing essential information. No unnecessary words or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple mutation tool with one parameter and no output schema, the description effectively covers purpose, usage guidance, behavioral notes, and parameter reference. It is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is only one parameter (task_id), and the schema already provides full description. The description repeats the schema's guidance to use ekyte_list_tasks. Schema coverage is 100%, so no additional value beyond baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (marcar como concluída) and the resource (tarefa no Ekyte), including the internal status (situation=30). It distinguishes from sibling tools like ekyte_get_task and ekyte_toggle_flow_phase.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description advises to confirm with the user before executing and suggests using ekyte_get_task first to check status. It provides good context for use, though it doesn't explicitly list when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ekyte_create_projectCriar Projeto no EkyteA

Cria um novo projeto no Ekyte baseado nos parâmetros e num payload adicional dinâmico.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesNome do projeto
workspaceIdYesID do workspace onde o projeto será criado
templateIdNoID do modelo (template) do projeto, se houver
startDateNoData de início no formato YYYY-MM-DD
endDateNoData final no formato YYYY-MM-DD
endpoint_overrideNoOpcional: override da rota de criação. Padrão é 'projects'.
additional_payloadNoCampos adicionais que podem ser requeridos pelo Ekyte para criar um projeto (JSON)

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate a non-read-only, non-destructive, non-idempotent write operation. The description adds context about a dynamic additional payload, which aids understanding of the tool's behavior. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, clear sentence that efficiently conveys the tool's purpose. It is front-loaded with the action and avoids unnecessary words, earning its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of an output schema, the description should ideally mention return values. It also omits details about error handling, authentication requirements, or the behavior of endpoint_override. While concise, it leaves gaps for a complex tool with 7 parameters and a dynamic payload.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are already well-documented. The description adds value by emphasizing the dynamic nature of additional_payload and hinting that extra fields may be required by Ekyte, going beyond the schema's static descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Cria um novo projeto' (creates a new project), specifying the verb and resource. However, it does not explicitly distinguish from sibling tools like ekyte_create_task, relying on the tool name for differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives (e.g., ekyte_create_task for tasks). The description lacks contextual recommendations or exclusions, making it less helpful for an AI agent deciding which tool to invoke.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ekyte_create_taskCriar Tarefa no Ekyte (fase única ou multi-fase)A
Destructive

Cria uma nova tarefa no Ekyte. Suporta DOIS modos:

MODO 1 — FASE ÚNICA (simples): Forneça executor_id + phase_id. Tarefa nasce com 1 fase.

MODO 2 — MULTI-FASE (com executores diferentes por fase): Forneça phases[] com uma entrada por fase. Cada entrada tem { phase_id, executor_id, effort_minutes, phase_start_date?, phase_due_date? }. A tarefa começa na PRIMEIRA fase da lista.

Fluxo recomendado ANTES:

  1. ekyte_list_workspaces → workspace_id

  2. ekyte_list_task_types → task_type_id (+ workflow_id)

  3. ekyte_list_phases(workflow_id) → phase_ids disponíveis

  4. ekyte_list_users → executor_id (UUID)

  5. Chamar este tool

IMPORTANTE: Sempre confirme TODOS os dados com o usuário antes de criar.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesTítulo da nova tarefa
workspace_idYesID numérico do workspace no Ekyte. Use ekyte_list_workspaces para descobrir o ID.
task_type_idYesID do tipo de tarefa. Use ekyte_list_task_types para descobrir o ID.
executor_idNoUUID do responsável principal. Obrigatório se phases[] NÃO for fornecido. Se phases[] for fornecido, é ignorado.
phase_idNoID da etapa/fase inicial. Obrigatório se phases[] NÃO for fornecido. Se phases[] for fornecido, é ignorado.
estimated_time_minutesNoTempo estimado total em minutos (ex: 60 para 1 hora). Ignorado em multi-fase: soma dos esforços de phases[].
phase_start_dateYesData de início padrão (AAAA-MM-DD). Cada fase pode sobrescrever em phases[].
phase_due_dateYesData de entrega padrão (AAAA-MM-DD). Cada fase pode sobrescrever em phases[].
descriptionNoDescrição detalhada da tarefa (opcional)
priorityNoPrioridade (0-1000). Ex: 100=Baixa, 300=Média, 500=Alta. Opcional.
phasesNoMULTI-FASE: lista de fases com executores distintos. Quando fornecido, executor_id/phase_id de cima são IGNORADOS — a tarefa começa na primeira fase da lista. Use para criar tarefas com pessoas diferentes em cada etapa do fluxo.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate destructiveHint=true (creating a task) and readOnlyHint=false. The description adds context on mode usage and prerequisites, but does not disclose other behaviors like auth requirements or rate limits. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (modes, recommended flow, important note) and is appropriately sized for the tool's complexity. Minor verbosity could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 11 parameters, two operating modes, and required prerequisite data, the description comprehensively covers usage context, mode selection, and pre-conditions. No output schema, but the description adequately sets expectations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, but the description adds value by explaining inter-parameter dependencies (e.g., ignoring executor_id when phases[] is provided) and mode-specific parameter usage beyond individual schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it creates a new task in Ekyte, supporting two distinct modes (single phase and multi-phase). It uses a specific verb ('cria') and resource ('tarefa'), and differentiates from sibling tools like ekyte_update_task by detailing mode-specific behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a recommended 5-step flow before calling and an important note to confirm with user. It distinguishes between single and multi-phase modes, but does not explicitly state when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ekyte_create_time_entry_without_taskApontar Horas Sem Tarefa (Avulso)A
Destructive

Cria um apontamento de horas avulso (sem vincular a uma tarefa específica).

Equivalente a usar o botão "Adicionar apontamento" na tela principal do Ekyte, selecionando Workspace, Tipo de Tarefa e Etapa manualmente.

Parâmetros obrigatórios:

  • workspace_id: ID do workspace (use ekyte_list_workspaces)

  • task_type_id: ID do tipo de tarefa (use ekyte_list_task_types)

  • phase_id: ID da etapa

  • date, start_time, end_time

IMPORTANTE: Sempre confirme os dados com o usuário antes de executar.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspace_idYesID numérico do workspace no Ekyte. Use ekyte_list_workspaces para descobrir o ID.
task_type_idYesID do tipo de tarefa. Use ekyte_list_task_types para descobrir o ID.
phase_idYesID da etapa. Obtido dos dados do tipo de tarefa.
dateYesData do apontamento no formato AAAA-MM-DD (ex: 2026-04-13)
start_timeYesHora de início no formato HH:MM (ex: 08:30)
end_timeYesHora de fim no formato HH:MM (ex: 13:08)
commentNoComentário opcional sobre o apontamento
non_productiveNoSe true, marca o apontamento como 'não produtivo'

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate destructiveHint=true, so the description's 'Cria' is consistent. The description adds a behavioral note 'IMPORTANTE: Sempre confirme os dados com o usuário antes de executar', which goes beyond annotations. No other traits like side effects or permissions are mentioned, but the core behavior is clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two short paragraphs and a bullet list. Key information is front-loaded (purpose), and every sentence earns its place (usage comparison, required params, user confirmation note). No redundant text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 8 parameters and no output schema, the description covers the required parameters and provides usage context. It lacks mention of optional parameters and return value but is adequate for a tool with comprehensive schema descriptions. The 'IMPORTANTE' note adds safety guidance.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description lists required parameters and their purpose (e.g., 'use ekyte_list_workspaces'), which adds some value but does not significantly extend the detailed schema descriptions already present. Optional parameters like 'comment' and 'non_productive' are omitted from the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Cria um apontamento de horas avulso (sem vincular a uma tarefa específica)', which uses a specific verb ('Cria'), identifies the resource ('apontamento de horas'), and distinguishes from the sibling 'ekyte_create_time_entry_with_task' by emphasizing 'without task'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context by comparing to a UI button and lists required parameters. It includes an important instruction to confirm data with the user. However, it does not explicitly state when to use this tool over its sibling or alternatives, though the name and context hint at it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ekyte_create_time_entry_with_taskApontar Horas em Tarefa EspecíficaA
Destructive

Cria um apontamento de horas vinculado a uma tarefa específica no Ekyte.

Equivalente a abrir uma tarefa no Ekyte e clicar em "Adicionar apontamento" → "Manual".

Parâmetros obrigatórios:

  • workspace_id: ID do workspace (use ekyte_list_workspaces)

  • task_id: ID da tarefa (use ekyte_list_tasks)

  • date: Data do apontamento (AAAA-MM-DD)

  • start_time: Hora de início (HH:MM)

  • end_time: Hora de fim (HH:MM)

IMPORTANTE: Sempre confirme os dados com o usuário antes de executar. A hora de fim DEVE ser posterior à hora de início. O esforço (duração) é calculado automaticamente.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspace_idYesID numérico do workspace no Ekyte. Use ekyte_list_workspaces para descobrir o ID.
task_idYesID numérico da task no Ekyte. Use ekyte_list_tasks para descobrir o ID.
dateYesData do apontamento no formato AAAA-MM-DD (ex: 2026-04-13)
start_timeYesHora de início no formato HH:MM (ex: 08:30)
end_timeYesHora de fim no formato HH:MM (ex: 13:08)
commentNoComentário opcional sobre o apontamento
manual_timeNoHorário manual de referência no formato HH:MM (opcional)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reveals that end_time must be after start_time and that duration is auto-calculated. Annotations indicate destructiveHint=true (creation is destructive) and readOnlyHint=false, which align with the description. No contradictions. It adds value beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, well-structured with paragraphs and bullet points, and each sentence adds value. No redundant or irrelevant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description thoroughly covers input behavior, mandatory parameters, constraints (time order), and includes a user confirmation directive. It is complete for a creation tool with good annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds meaning by listing required parameters with format examples (AAAA-MM-DD, HH:MM) and referencing discovery tools for IDs. This exceeds schema documentation but does not fully explain optional parameters like 'manual_time'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it creates a time entry linked to a specific task ('Cria um apontamento de horas vinculado a uma tarefa específica'), with a specific verb and resource. It also distinguishes from the sibling tool 'ekyte_create_time_entry_without_task' by emphasizing the task binding.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidelines, including the equivalence to manual entry, required parameter steps, and a warning to confirm data with the user. However, it does not explicitly list when this tool should be avoided or compare to alternatives like the without-task variant.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ekyte_delete_time_entryDeletar Apontamento de HorasA
DestructiveIdempotent

Remove um apontamento de horas no Ekyte (soft delete via mudança de status).

Parâmetros obrigatórios:

  • workspace_id: ID do workspace

  • time_entry_id: ID do apontamento (use ekyte_list_time_entries para descobrir)

IMPORTANTE: Esta ação NÃO pode ser desfeita. Sempre confirme com o usuário antes de executar. Use ekyte_list_time_entries para verificar o apontamento correto antes de deletar.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspace_idYesID numérico do workspace no Ekyte. Use ekyte_list_workspaces para descobrir o ID.
time_entry_idYesID numérico do apontamento a ser deletado. Use ekyte_list_time_entries para descobrir o ID.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses behavior beyond annotations: it is a soft delete via status change and is irreversible. Annotations already set destructiveHint=true, idempotentHint=true, and readOnlyHint=false; the description adds valuable context without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is succinct: it states the purpose, lists key parameters, and includes an important irreversible note. Every sentence serves a purpose, with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Fully covers all necessary aspects for a simple delete tool: purpose, required parameters with discovery hints, and an important behavioral warning. No output schema is expected, so completeness is high given the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 100% coverage with descriptions for both parameters. The description adds guidance on how to discover the time_entry_id using ekyte_list_time_entries, which goes beyond schema details. Baseline is 3 due to high coverage, but the extra discovery tip earns a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Remove um apontamento de horas no Ekyte (soft delete via mudança de status)', specifying the verb (remove), resource (time entry), and method (soft delete). This distinguishes it from sibling tools like ekyte_list_time_entries or ekyte_create_time_entry.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly warns that the action cannot be undone, instructs to confirm with the user before executing, and advises using ekyte_list_time_entries to verify the correct entry. This provides clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ekyte_get_taskVer Detalhes de uma TarefaA
Read-onlyIdempotent

Busca os detalhes completos de uma tarefa específica pelo ID.

Use ekyte_list_tasks primeiro para encontrar o ID.

Retorna: título, descrição, status, responsável, workspace, tipo, datas, tempos.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYesID numérico da task no Ekyte. Use ekyte_list_tasks para descobrir o ID.
response_formatNoFormato de saídamarkdown

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive. Description adds return field summary (title, description, status, etc.), which is valuable beyond annotations. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short paragraphs, front-loaded with key purpose and prerequisite. Every sentence adds value. No redundancies.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description lists key return fields (title, description, status, assignee, workspace, type, dates, times). For a get-details tool, this is sufficient. Sibling tools are distinct.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description repeats the prerequisite for task_id but adds no new information beyond schema. Response_format is not mentioned, but schema covers it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The title and description clearly state the tool retrieves complete task details by ID. It distinguishes from siblings like ekyte_list_tasks (which lists tasks) and ekyte_update_task (which modifies).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to use ekyte_list_tasks first to find the ID. Implicitly suggests this tool is for reading details after listing. Could more directly compare to alternatives, but it's adequate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ekyte_list_phasesListar Fases (Phases) de um WorkflowA
Read-onlyIdempotent

Lista as fases (phases) de um workflow do Ekyte.

Cada tipo de tarefa pertence a um workflow, e o workflow contém as fases possíveis para tarefas daquele tipo.

Use esta ferramenta ANTES de criar uma tarefa: descubra o workflow_id via ekyte_list_task_types, depois use este tool para achar o phase_id correto (normalmente a fase inicial).

Retorna: id, nome, sequencial, ativo.

ParametersJSON Schema
NameRequiredDescriptionDefault
workflow_idYesID do workflow. Obtenha via ekyte_list_task_types (campo workflow_id).
response_formatNoFormato de saídamarkdown

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds context about the usage workflow and the return fields (id, nome, sequencial, ativo), but does not discuss pagination, limits, or other behavioral details. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (under 10 sentences), well-structured with purpose first, then context, usage instructions, and return info. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description specifies return fields and explains the tool's role in the workflow creation process. Annotations cover safety, so the description is sufficient for an agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with clear descriptions for both parameters. The description does not add significant new meaning beyond the schema, though it reinforces the context of workflow_id. Baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists phases of a workflow, explains the relationship between task types, workflows, and phases, and distinguishes it from sibling tools by specifying its use case before creating a task. It mentions the return fields.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to use this tool BEFORE creating a task, tells to first get workflow_id via ekyte_list_task_types, and then use this tool to find the phase_id. This provides clear when-to-use and how-to-use guidance with sibling tool references.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ekyte_list_projectsListar Projetos do EkyteA
Read-onlyIdempotent

Lista projetos da empresa no Ekyte. Use is_planning=1 para buscar projetos que estão com tarefas planejadas mas não ativas ainda. Você pode sobrescrever o endpoint caso a API utilize um caminho diferente de 'projects' (ex: 'ctc-projects').

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoNúmero da página (inicia em 1). Cada página retorna até 100 registros.
response_formatNoFormato de saída: 'markdown' para leitura humana ou 'json' para dados estruturadosmarkdown
searchNoBusca por nome do projeto
workspace_idNoID do workspace para filtrar os projetos
statusNoFiltrar por status do projeto (situation)
is_planningNoUse 1 para filtrar projetos que são apenas planejamento (tarefas planejadas não ativas), 0 para não-planejamento
endpoint_overrideNoOpcional: override da rota da API (ex: 'projects', 'ctc-projects', 'plans'). Padrão é 'projects'.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnly, destructive false, idempotent, openWorld. Description adds useful behavioral details like filtering with is_planning and endpoint override, without contradicting annotations. No extra info on auth or rate limits needed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with main purpose, zero fluff. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequately covers the main functionality and key parameters. No output schema, but description hints at return format via response_format param. Lacks default ordering or pagination details, but schema covers page param.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but description adds value beyond schema for key parameters: explains is_planning purpose and endpoint_override use case. Other params are well-described in schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists projects from the company in Ekyte, with specific guidance on using is_planning and endpoint override. It distinguishes from sibling tools like ekyte_create_project by being a read operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context for using is_planning=1 to find projects with planned but inactive tasks, and mentions endpoint override. However, it does not explicitly compare with sibling list tools (e.g., ekyte_list_tasks) to guide when to use this vs others.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ekyte_list_project_tasksListar Tarefas de um ProjetoA
Read-onlyIdempotent

Lista as tarefas associadas a um projeto específico. Excelente para verificar se existem "tarefas planejadas mas não ativas" dentro de um projeto.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoNúmero da página (inicia em 1). Cada página retorna até 100 registros.
response_formatNoFormato de saída: 'markdown' para leitura humana ou 'json' para dados estruturadosmarkdown
project_idYesID do projeto (obtido via ekyte_list_projects)
searchNoFiltrar por nome da tarefa
statusNoFiltrar por status da tarefa

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

As anotações já indicam readonlyHint=true, destructiveHint=false, idempotentHint=true. A descrição não adiciona detalhes comportamentais além do propósito básico. A paginação (100 registros por página) está no esquema, não na descrição.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Duas frases diretas, sem redundância. A primeira frase estabelece a função principal, a segunda adiciona valor com um caso de uso específico.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A descrição é suficiente para uma ferramenta de listagem com esquema completo e anotações ricas. Faltam detalhes sobre o formato de retorno, mas isso é aceitável dado que não há esquema de saída.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

A cobertura do esquema é 100%, então a linha de base é 3. A descrição não adiciona significado além do que está no esquema; os parâmetros search e status não são elaborados.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Descreve claramente a ação (listar) e o recurso (tarefas de um projeto específico), diferenciando-se de irmãos como ekyte_list_tasks (que lista todas as tarefas). A menção de verificar 'tarefas planejadas mas não ativas' adiciona contexto específico.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Fornece um caso de uso claro (verificar tarefas planejadas mas não ativas), mas não menciona explicitamente quando não usar ou alternativas como ekyte_get_task para tarefas individuais.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ekyte_list_project_templatesListar Modelos de ProjetosB
Read-onlyIdempotent

Lista modelos (templates) de projetos disponíveis para criar novos projetos.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoNúmero da página (inicia em 1). Cada página retorna até 100 registros.
response_formatNoFormato de saída: 'markdown' para leitura humana ou 'json' para dados estruturadosmarkdown
searchNoBusca por nome do modelo/template
endpoint_overrideNoOpcional: override da rota da API (ex: 'projects'). Padrão é 'projects'.

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds no extra behavioral context beyond what's in the schema and annotations, such as pagination details or authentication needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single short sentence, which is concise and front-loaded. It avoids unnecessary words, though it could be slightly more informative without losing conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 4 parameters and no output schema, the description is too minimal. It does not mention pagination, search behavior, or response format options, relying entirely on schema descriptions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds no additional meaning about parameters beyond what the schema provides (page, response_format, search, endpoint_override).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists project templates for creating new projects, distinguishing it from sibling tools like ekyte_list_projects which lists actual projects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives (e.g., ekyte_list_projects, ekyte_create_project). The description lacks context about prerequisites or when to search vs list all.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ekyte_list_task_flow_phasesListar Fases de uma Tarefa (com Executor por Fase)A
Read-onlyIdempotent

Lista TODAS as fases de uma tarefa específica, mostrando quem é o responsável (executor), datas e tempo estimado POR FASE.

Use ANTES de editar executor/datas/esforço de uma fase específica com ekyte_update_phase.

Diferença vs ekyte_list_phases:

  • ekyte_list_phases: lista fases do WORKFLOW (template) — o que pode existir.

  • ekyte_list_task_flow_phases: lista fases DESTA TAREFA — o que existe de fato, com quem.

Retorna para cada fase: phase_id, sequential, nome, executor (UUID + nome), effort, start/due date.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYesID numérico da task no Ekyte. Use ekyte_list_tasks para descobrir o ID.
project_idNoID do projeto (necessário se for uma tarefa de projeto). Tarefas avulsas não precisam.
response_formatNoFormato de saídamarkdown

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, destructiveHint false, and idempotentHint true, so the description adds context about the returned fields (phase_id, executor, dates, etc.) and the factual nature of the data. No contradictions; the description adds moderate value beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise: two sentences for purpose, one for usage guidance, and a bulleted differentiation. No unnecessary words, and key information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (list operation) with robust annotations and schema. The description explains what each returned phase includes (phase_id, sequential, name, executor, effort, dates), compensating for the lack of an output schema. All necessary context is provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage with descriptive parameter descriptions. The description additionally mentions that task_id can be discovered via ekyte_list_tasks, adding extra guidance. Since schema coverage is high, this exceeds the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists all phases of a specific task, showing executor, dates, and estimated time per phase. It explicitly distinguishes itself from the sibling tool ekyte_list_phases by contrasting template vs actual phases.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description advises using this tool before editing a phase with ekyte_update_phase, providing clear context for when to invoke it. It also differentiates from ekyte_list_phases, offering alternative usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ekyte_list_tasksListar Tarefas do EkyteA
Read-onlyIdempotent

Lista tarefas da empresa no Ekyte com filtros opcionais.

Filtros server-side: workspace_id, status, task_type_id, phase_id, executor_id, datas. Filtro client-side: search (texto no título).

PAGINAÇÃO: a API do Ekyte não pagina este endpoint — o MCP faz paginação client-side (50 por página) após aplicar todos os filtros.

DICA: sempre filtre por workspace_id para reduzir o volume. Use ekyte_list_workspaces com search para achar o ID.

Retorna: id, título, status, responsável, datas, tempo estimado/real, workspace, tipo de tarefa.

ParametersJSON Schema
NameRequiredDescriptionDefault
searchNoFiltro de texto (case-insensitive) no título da tarefa. Ex: 'playbook'.
workspace_idNoID do workspace para filtrar. Use ekyte_list_workspaces para descobrir.
statusNoFiltro por situação: 10=Ativas, 20=Pausadas, 30=Concluídas, 40=Canceladas. Padrão: 10 (Ativas)
task_type_idNoID do tipo de tarefa para filtrar. Use ekyte_list_task_types para descobrir.
phase_idNoID da etapa atual para filtrar.
executor_idNoUUID do responsável para filtrar. Use ekyte_list_users para descobrir.
created_fromNoFiltrar tasks criadas a partir desta data (AAAA-MM-DD)
created_toNoFiltrar tasks criadas até esta data (AAAA-MM-DD)
due_fromNoFiltrar por data de entrega a partir de (AAAA-MM-DD)
due_toNoFiltrar por data de entrega até (AAAA-MM-DD)
pageNoPágina do resultado filtrado (paginação client-side, 50 por página).
response_formatNoFormato de saídamarkdown

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate safe read-only operation; description adds critical behavioral details: API does not paginate, MCP applies client-side pagination after filters. Also lists return fields. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is well-structured with clear sections: purpose, filter types, pagination, tip, return fields. It is front-loaded and concise, though a bit long with repeated sentences about filter types. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 12 parameters (all documented in schema), no output schema, and clear annotations, the description covers behavioral nuance (pagination, filter scope), cross-references to discover IDs, and return fields. It is comprehensive for an agent to use effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description adds value by classifying filters as server-side vs client-side, providing example values (e.g., 'playbook' for search), and explaining pagination parameters. This goes beyond schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it lists tasks with optional filters, and the title 'Listar Tarefas do Ekyte' is specific. It distinguishes from sibling tools like ekyte_list_project_tasks by being company-wide and listing workspace filter. Purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance on filtering by workspace_id to reduce volume, cross-references to ekyte_list_workspaces, and explains server-side vs client-side filter behavior. Also mentions default status filter. No explicit when-not-to-use but overall very helpful.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ekyte_list_task_typesListar Tipos de Tarefa do EkyteA
Read-onlyIdempotent

Lista todos os tipos de tarefa (templates) da empresa.

Use para descobrir o task_type_id antes de criar tarefas. Retorna: id, nome, workflow_id (importante: cada task-type pertence a um workflow, e as phases vivem no workflow).

DICA: Depois de achar o task_type, use ekyte_list_phases com o workflow_id correspondente para descobrir as phases disponíveis.

ParametersJSON Schema
NameRequiredDescriptionDefault
searchNoFiltro de texto (case-insensitive) no nome do tipo de tarefa. Ex: 'onboarding'.
active_onlyNoSe true, retorna só tipos ativos (active=1).
pageNoPágina do resultado filtrado (paginação client-side, 50 por página).
response_formatNoFormato de saídamarkdown

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=true. The description adds behavioral details: what is returned (id, nome, workflow_id) and the relationship between task-types and workflows. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two front-loaded paragraphs. Every sentence adds value: main purpose, return fields, relationship, and tip. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description adequately tells what is returned (id, nome, workflow_id) and the workflow relationship. It also provides a hint about next steps, making it complete for a list tool with 4 parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (all 4 parameters have descriptions). The description adds value: search filter is case-insensitive with an example, and pagination is client-side with 50 per page. This goes beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists all task types/templates and is used to discover task_type_id before creating tasks. It distinguishes from sibling tools like ekyte_list_phases by mentioning the relationship and providing a tip for subsequent use.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says to use it to find task_type_id before creating tasks, and provides a tip: after finding the task_type, use ekyte_list_phases with the corresponding workflow_id. This gives clear when-to-use and an alternative next step.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ekyte_list_time_entriesListar Apontamentos de HorasA
Read-onlyIdempotent

Lista apontamentos de horas no Ekyte para um workspace em um período.

Parâmetros obrigatórios:

  • workspace_id: ID do workspace (use ekyte_list_workspaces para descobrir)

  • date_from / date_to: Período de datas (AAAA-MM-DD)

Filtros client-side opcionais:

  • user_id: UUID do usuário

  • task_id: ID da tarefa

PAGINAÇÃO: client-side (50 por página). O MCP puxa todos os apontamentos do período e filtra depois.

Retorna: id, data, horário, duração, tarefa, usuário, comentário.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspace_idYesID numérico do workspace no Ekyte. Use ekyte_list_workspaces para descobrir o ID.
date_fromYesData inicial do filtro no formato AAAA-MM-DD (obrigatório)
date_toYesData final do filtro no formato AAAA-MM-DD (obrigatório)
user_idNoUUID do usuário para filtrar apontamentos. Use ekyte_list_users para descobrir.
task_idNoID da tarefa para filtrar apontamentos específicos dela.
pageNoPágina do resultado (paginação client-side, 50 por página).
response_formatNoFormato de saídamarkdown

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only, non-destructive, idempotent, open-world. The description adds value by detailing client-side pagination (50 per page, fetches all then filters) and listing return fields, without contradicting annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, well-structured, and front-loaded. It starts with the purpose, then lists required parameters, optional filters, pagination note, and return fields. Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with 7 parameters (3 required) and no output schema, the description fully covers parameter semantics, pagination behavior, and return fields. It references sister tools for ID lookups, making it self-contained for an agent to execute correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions, but the description adds practical guidance: referencing ekyte_list_workspaces for workspace_id, ekyte_list_users for user_id, and explaining the date format. This cross-tool context is highly valuable beyond the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Lista apontamentos de horas no Ekyte para um workspace em um período', specifying the verb (list), resource (time entries), and scope (workspace, date range). It distinguishes from sibling tools that create, update, or delete entries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description outlines required parameters (workspace_id, date_from, date_to) and optional filters, plus clarifies client-side pagination. Although no alternative tools are mentioned for comparison, the usage context is clear and sufficient for an agent to understand when to call this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ekyte_list_usersListar Usuários do EkyteA
Read-onlyIdempotent

Lista usuários/membros da empresa no Ekyte.

👉 PREFIRA usar "search" (busca por nome OU email, case-insensitive) para achar alguém rapidamente. Ex: search="pietro".

Retorna: id (UUID), nome, email.

IMPORTANTE: O ID do usuário é um UUID (ex: "feff4a61-b0a3-483d-a384-172c4b301ee0"), não um número.

Paginação client-side: 50 por página.

ParametersJSON Schema
NameRequiredDescriptionDefault
searchNoFiltro de texto (case-insensitive) por nome ou email.
pageNoPágina do resultado filtrado (paginação client-side, 50 por página).
response_formatNoFormato de saídamarkdown

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the tool as read-only and idempotent. The description adds behavioral details: IDs are UUIDs, pagination is client-side (50 per page), and search is case-insensitive. This enriches the agent's understanding of behavior beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise (three short sentences) with front-loaded purpose and key usage tips. Every sentence adds value: purpose, search preference, return fields, UUID warning, and pagination. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Without an output schema, the description fully specifies the return fields (id, name, email) and pagination behavior. It covers all three optional parameters with usage guidance. The tool has moderate complexity, and the description leaves no gaps for an agent to understand its usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds significant context: search is case-insensitive with an example, page indicates client-side pagination with 50 per page, and response_format is described. This goes beyond the schema's bare descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Lista usuários/membros da empresa no Ekyte', specifying the action (list) and resource (users). It is distinct from sibling tools, which focus on tasks, projects, and time entries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description recommends preferring the 'search' parameter for quick lookups, providing explicit usage guidance. However, it does not explicitly mention when not to use this tool or compare with alternatives, though no alternative exists for listing users.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ekyte_list_workspacesListar Workspaces do EkyteA
Read-onlyIdempotent

Lista workspaces (clientes/projetos) da empresa no Ekyte.

👉 PREFIRA usar o parâmetro "search" para achar um workspace pelo nome (ex: search="ferraz" acha "V4 Ferraz Piai"). É mais rápido que iterar páginas.

Use esta ferramenta ANTES de criar tasks ou apontar horas. Retorna: id, nome, status (ativo/inativo).

Paginação client-side: 50 registros por página. Total típico: 600+ workspaces.

ParametersJSON Schema
NameRequiredDescriptionDefault
searchNoFiltro de texto (case-insensitive) no nome do workspace. Ex: 'ferraz' acha 'V4 Ferraz Piai'.
active_onlyNoSe true, retorna só workspaces ativos (active=1).
pageNoPágina do resultado filtrado (paginação client-side, 50 por página).
response_formatNoFormato de saídamarkdown

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint. Description adds valuable behavioral context: client-side pagination (50 per page), typical total (600+), and search behavior. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Very concise, uses bullet points and emoji for readability. Front-loads purpose and usage tips, every sentence adds value. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, usage scenario, search optimization, pagination details, and return fields. No output schema but mentions what returns. Completeness is adequate for a read-only list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all parameters (100% coverage). Description enhances semantics with search example, case-insensitivity note, and pagination context beyond schema. Adds meaning beyond structured data.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it lists workspaces (clientes/projetos) and specifies return fields (id, nome, status). It also distinguishes from sibling list tools by focusing on workspaces.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly advises to prefer using the search parameter for efficiency and recommends using this tool before creating tasks or logging hours. Lacks explicit when-not-to-use but provides strong when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ekyte_toggle_flow_phaseAtivar ou Desativar Fase de uma Tarefa de ProjetoA
DestructiveIdempotent

Ativa (adiciona) ou desativa (remove) uma fase no fluxo de uma tarefa de projeto.

Use ekyte_list_task_flow_phases PRIMEIRO para ver todas as fases disponíveis (ativas e inativas) e seus IDs.

Parâmetros:

  • task_id: ID da tarefa

  • project_id: ID do projeto (OBRIGATÓRIO)

  • phase_id: ID da fase (phaseId) a ativar/desativar

  • active: 1 = ATIVAR (adicionar), 0 = DESATIVAR (remover)

  • executor_id: UUID do executor (opcional ao desativar, recomendado ao ativar)

FUNCIONAMENTO: Busca o estado atual da tarefa, modifica o campo 'active' da fase desejada e envia o array completo via PUT.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYesID numérico da task no Ekyte. Use ekyte_list_tasks para descobrir o ID.
project_idYesID do projeto. Obrigatório — esta operação só funciona para tarefas de projeto.
phase_idYesID da fase (phaseId) a ativar ou desativar. Use ekyte_list_task_flow_phases para listar as fases e seus IDs.
activeYes1 = ATIVAR a fase (adicionar ao fluxo). 0 = DESATIVAR a fase (remover do fluxo).
executor_idNoUUID do executor para esta fase. Opcional ao desativar, recomendado ao ativar.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations include destructiveHint=true and idempotentHint=true, which are consistent with the tool's write behavior. The description adds valuable insights by explaining that the tool fetches the current state, modifies the 'active' field, and sends the full array via PUT. This goes beyond the annotations, but no output format is mentioned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear main action, bullet points for parameters, and a functional note. It is concise and front-loaded, but the bullet list could be slightly more compact without losing clarity. Overall efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description does not explain return values, but it adequately covers the input parameters and the internal behavior (PUT operation). Annotations provide safety hints. For a 5-param tool, this is sufficient, though a brief note on the response would improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters. The description adds some additional context, such as explaining the meaning of active and the optional nature of executor_id, but this does not significantly exceed the schema's own descriptions. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: to activate or deactivate a phase in a project task flow. The title 'Ativar ou Desativar Fase' and description use specific verbs and resources. It distinguishes from sibling tools like ekyte_list_task_flow_phases (which only lists) and ekyte_update_phase (which might update phase properties, not toggle).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly advises using ekyte_list_task_flow_phases first to see available phases, and explains the active parameter (1=activate, 0=deactivate). However, it does not explicitly state when not to use this tool or mention alternatives for similar operations, such as updating a phase directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ekyte_update_phaseEditar Fase Específica de uma Tarefa (executor, esforço, datas)A
DestructiveIdempotent

Atualiza uma fase específica dentro de uma tarefa — permite trocar executor/datas/esforço de QUALQUER fase do fluxo, não só da fase atual.

Caso de uso: "mudar quem é o responsável pela fase de Execução da tarefa #123", sem alterar as outras fases.

Fluxo recomendado:

  1. ekyte_list_task_flow_phases(task_id) → ver todas as fases e seus phase_ids

  2. ekyte_update_phase(task_id, phase_id, ...campos a trocar)

Campos opcionais (pelo menos 1 obrigatório):

  • executor_id: Novo responsável desta fase (UUID)

  • effort_minutes: Novo tempo estimado desta fase (minutos)

  • phase_start_date: Nova data de início desta fase (AAAA-MM-DD)

  • phase_due_date: Nova data de entrega desta fase (AAAA-MM-DD)

IMPORTANTE: Confirme as alterações com o usuário antes de executar.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYesID numérico da task no Ekyte. Use ekyte_list_tasks para descobrir o ID.
project_idNoID do projeto (necessário APENAS se for uma tarefa de projeto). Tarefas avulsas não precisam disso.
phase_idYesID da fase a atualizar dentro desta tarefa. Use ekyte_list_task_flow_phases para ver as fases e seus IDs.
executor_idNoNovo responsável (UUID) para ESTA FASE específica. Opcional.
effort_minutesNoNovo tempo estimado desta fase em minutos. Opcional.
phase_start_dateNoNova data de início desta fase (AAAA-MM-DD). Opcional.
phase_due_dateNoNova data de entrega desta fase (AAAA-MM-DD). Opcional.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate destructiveHint=true and idempotentHint=true. The description confirms it modifies data, adds a warning to confirm with user, and specifies that it can change executor, dates, effort for any phase. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: a clear one-sentence summary, a use-case example, a numbered recommended flow, and a bullet list of optional fields. Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 7 parameters (2 required) and no output schema, the description covers purpose, preconditions (list phases first), and parameter roles. It does not explain the return value or error handling, but the annotations adequately convey mutability and safety considerations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds extra context: clarifies that project_id is needed only for project tasks, groups fields as optional, and reinforces the need to use ekyte_list_task_flow_phases to get phase_id. This adds value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Atualiza') and resource ('fase específica dentro de uma tarefa'), and distinguishes from siblings like ekyte_toggle_flow_phase by clarifying it can update ANY phase, not just the current one.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a recommended two-step flow: first list phases to get phase_id, then update. Also notes that at least one optional field is required. Explicitly says to confirm changes with user. Does not explicitly state when not to use this tool versus alternatives, but the flow provides clear context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ekyte_update_taskEditar Tarefa no Ekyte (fase atual / top-level)A
DestructiveIdempotent

Atualiza campos TOP-LEVEL de uma tarefa existente (título, descrição, executor/fase ATIVA, datas da fase atual, prioridade) usando JSON Patch.

Para editar executor/datas/esforço de uma FASE ESPECÍFICA não-atual, use ekyte_update_phase em vez deste.

Campos opcionais (pelo menos 1 obrigatório):

  • title: Novo título

  • description: Nova descrição (texto simples → convertido para HTML)

  • executor_id: UUID do novo responsável da fase atual

  • phase_id: ID da nova fase ATIVA (muda a fase corrente)

  • phase_start_date / phase_due_date: Datas da fase atual

  • priority_group: Grupo de prioridade (35=Baixa, 50=Média, 60=Alta, 90=Urgente)

  • priority: Prioridade bruta (0-1000) — normalmente prefira priority_group

IMPORTANTE: Sempre confirme as alterações com o usuário antes de executar.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYesID numérico da task no Ekyte. Use ekyte_list_tasks para descobrir o ID.
project_idNoID do projeto (necessário APENAS se for uma tarefa de projeto). Tarefas avulsas não precisam disso.
titleNoNovo título da tarefa (opcional)
descriptionNoNova descrição da tarefa em texto simples (será convertido para HTML). Opcional.
executor_idNoUUID do novo responsável da FASE ATUAL (opcional). Para trocar executor de uma fase específica não-atual, use ekyte_update_phase. Use ekyte_list_users para descobrir.
phase_idNoID da nova fase ATIVA da tarefa (opcional). Use ekyte_list_task_flow_phases para ver as fases disponíveis.
phase_start_dateNoNova data de início da etapa atual (AAAA-MM-DD). Opcional.
phase_due_dateNoNova data de entrega da etapa atual (AAAA-MM-DD). Opcional.
priority_groupNoGrupo de prioridade (0-100). É o campo que a UI do Ekyte usa: 35=Baixa, 50=Média, 60=Alta, 90=Urgente. Opcional.
priorityNoPrioridade numérica bruta (0-1000). Normalmente você quer priority_group em vez disso. Opcional.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (destructiveHint=true, idempotentHint=true), the description adds that the tool uses JSON Patch, converts description to HTML, and emphasizes user confirmation. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured: purpose first, then parameter list, then important note. Efficiently covers all necessary information for 10 parameters without redundancy. Slightly longer due to parameter explanations, but each sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 10 parameters and no output schema, the description covers behavior, parameter details, usage guidelines, and a confirmation requirement. Complete enough for an agent to use correctly. Lacks return value description, but utility is clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (baseline 3), but description adds value: maps priority_group to labels (35=Baixa, etc.), advises preference for priority_group over priority, and explains description conversion. Adds meaning beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool updates top-level fields of an existing task (title, description, executor, dates, priority). It distinguishes from the sibling tool ekyte_update_phase for editing specific phases, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides when-to-use vs alternatives: 'Para editar executor/datas/esforço de uma FASE ESPECÍFICA não-atual, use ekyte_update_phase em vez deste.' Also instructs to confirm changes with the user before executing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A4/5.0
Disambiguation4/5

Most tools have distinct purposes, but `ekyte_list_phases` and `ekyte_list_task_flow_phases` could be confused despite descriptions clarifying the difference.

Naming Consistency5/5

All tools follow a consistent `ekyte_verb_noun` pattern (e.g., `ekyte_add_task_comment`), with verbs like `list`, `create`, `update`, and `delete` used predictably.

Tool Count5/5

21 tools cover tasks, projects, time entries, workspaces, and users without being excessive; each tool serves a clear operational need.

Completeness3/5

Core CRUD for tasks and time entries has notable gaps: no delete task or update time entry tool. Project management lacks update/delete, but basic workflows are covered.

Maintenance

ActivityInactive
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/FerrazPiai/ekyte_mcp_server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server