Ekyte MCP Server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Ekyte MCP Serverlist my workspaces"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 ocompany_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:
Clone o repo:
git clone https://github.com/FerrazPiai/ekyte_mcp_server.git cd ekyte_mcp_serverAbra o Claude Code dentro dessa pasta:
claudeMande 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_TOKENeEKYTE_COMPANY_ID(instruções passo-a-passo no DevTools)Instalar dependências e buildar (
npm install && npm run build), quando for modo localRegistrar 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ção → Deploy → Conexão com o Claude.
Tools Disponíveis
Leitura (read-only)
Tool | Descrição |
| Lista workspaces (clientes) da empresa |
| Lista usuários/membros (com UUID) |
| Lista tipos de tarefa (template + workflow_id) |
| Lista fases de um workflow (para descobrir |
| Lista tarefas com filtros (workspace, status, datas, etc.) |
| Lista as fases de uma tarefa específica, com executor/datas/esforço POR FASE |
| Detalhes de uma tarefa específica |
| Lista apontamentos de horas |
Escrita (destrutivo — pede confirmação)
Tool | Descrição |
| Cria nova tarefa (fase única ou multi-fase, com executor diferente por fase) |
| Edita campos top-level da tarefa (título, descrição, executor/fase atuais, prioridade) |
| Edita uma FASE específica da tarefa (executor, esforço, datas) — sem alterar as outras fases |
| Marca tarefa como concluída |
| Adiciona comentário na timeline |
| Aponta horas em tarefa específica |
| Aponta horas avulso |
| Remove apontamento |
Fluxo recomendado para criar uma tarefa
Fase única (simples)
ekyte_list_workspaces→workspace_idekyte_list_task_types→task_type_id(+workflow_idassociado)ekyte_list_phases(workflow_id)→phase_idinicialekyte_list_users→executor_id(UUID)ekyte_create_taskcom 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_taskCampos:
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ê
ekyte_list_task_flow_phases(task_id)→ ver todas as fases e seusphase_idekyte_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)
Entre em
https://app.ekyte.comcom sua conta e faça login.Abra o DevTools do navegador (
F12no Chrome/Edge, ouCtrl+Shift+I).Vá na aba Network (Rede).
Clique em qualquer tela do Ekyte (lista de tarefas, workspaces etc.) para gerar tráfego.
Filtre as requisições por
api.ekyte.com— clique em qualquer uma delas.Na aba Headers → Request Headers, localize a linha:
Authorization: Bearer eyJhbGciOi...<string longa>Copie só o que vem depois de
Bearer— esse é o valor deEKYTE_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.envlocal).
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_idO 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:
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
Entre no painel do seu Easypanel → selecione o projeto onde quer rodar o MCP (ou crie um novo).
Clique em + Service → App.
Dê um nome ao serviço, por exemplo
ekyte-mcp.Na aba Source:
Type:
GitHub(ouGitgenérico)Repository:
https://github.com/SEU-USUARIO/ekyte_mcp_server(ou o original se não fez fork)Branch:
mainBuild Path:
/(raiz)
Na aba Build:
Type:
DockerfileDockerfile 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=productionSalve e clique em Deploy.
4. Expor a porta e configurar o domínio
Na aba Domains do serviço, clique em + Add Domain.
Host:
ekyte-mcp.seu-dominio.com(use um subdomínio que aponte para o IP do Easypanel).Path:
/Port:
3000Marque HTTPS (o Easypanel cuida do Let's Encrypt).
Salve — em ~30s o SSL é emitido.
5. Configurar healthcheck (opcional, mas recomendado)
Na aba Deploy → Health Check:
Path:
/healthPort:
3000Interval: 30s
⚠️ Não adicione
HEALTHCHECKno 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 pulldo 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_TOKENem Environment → Deploy → 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.brcom registro A)
Passo-a-passo
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
Configurar branch e build pack
Branch:
mainBuild Pack:
Dockerfile(o Coolify detecta automaticamente oDockerfilena raiz — não precisa informar caminho customizado)Base Directory:
/(padrão)
Configurar porta e rede
Em General > Network, defina Ports Exposes como
3000Deixe Ports Mappings vazio (o Coolify gerencia via proxy Traefik interno)
⚠️ O Coolify só roteia tráfego para portas declaradas em
EXPOSEno Dockerfile. O Dockerfile deste projeto já fazEXPOSE 3000.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=productionMarque
EKYTE_BEARER_TOKENcomo Is Secret? para mascarar o valor nos logs e na UI
Configurar domínio e SSL
Em General > Domains, informe a URL completa com
https://, por exemplo:https://mcp.seudominio.com.brO 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
Configurar healthcheck
Em Healthchecks, ative Enabled
Path:
/health— Port:3000— Method:GETInterval:
30— Timeout:10— Retries:3
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). Todogit pushna branchmaindispara 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_serverno GitHub (recomendado fazer fork deFerrazPiai/ekyte_mcp_serverpara controlar quando redeployar)Token Ekyte (
EKYTE_BEARER_TOKEN) e ID da empresa (EKYTE_COMPANY_ID) em mãos
Passo-a-passo (via UI web)
Logue em railway.com e clique em New Project no canto superior direito do dashboard.
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_serverem Only select repositories).Escolha o repositório
ekyte_mcp_server(seu fork ou o original). A Railway detecta automaticamente oDockerfilena raiz e inicia o build — não precisa configurar buildpack.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=productionClique em Update Variables. A Railway faz um novo deploy automaticamente com as variáveis aplicadas.
⚠️ Nunca commite o
EKYTE_BEARER_TOKENno repositório. Use sempre as Variables da Railway.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.appcom HTTPS via Let's Encrypt já configurado. Confirme a porta3000quando solicitado.(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.(Opcional) Healthcheck: em Settings → Deploy, no campo Healthcheck Path, coloque
/health. Isso faz a Railway aguardar o endpoint responder200antes 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.appRender
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
Conta no Render (signup com GitHub recomendado)
Fork ou acesso ao repositório
ekyte_mcp_serverno GitHub
Passo-a-passo (via dashboard)
No dashboard do Render, clique em + New (canto superior direito) → Web Service.
Em Source Code, selecione GitHub e autorize o Render a acessar o repositório
ekyte_mcp_server. Clique em Connect ao lado do repo.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 oDockerfilena raiz)Branch:
mainRegion:
Oregon (US West)ouFrankfurt (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:
Freepara testes ouStarter($7/mês) para uso contínuo sem sleep
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.
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 — cadagit pushna branchmaindispara um novo deploy)
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 /healtha cada 10 minutos — funciona mas pode ser bloqueado pelo RenderUsar 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
flyctlinstalada localmenteGit 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 | shValide a instalação:
fly versionPasso 2 — Fazer login
fly auth loginUm 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_serverPasso 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-deployResponda às perguntas interativas:
App name: escolha algo único, ex:
ekyte-mcp-seunomeRegion: escolha a mais próxima (ex:
grupara São Paulo,gigpara Rio)Postgres / Redis / Sentry: responda
Nopara todosDeploy 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]nofly.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_TOKENnofly.tomlnem em arquivos.envversionados. Secrets do Fly são o canal correto.
Confira os secrets cadastrados (o Fly mostra apenas o hash, nunca o valor):
fly secrets listPasso 7 — Fazer o deploy
fly deployO 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 deployO 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-1xcom 256MB. Comauto_stop_machines = "stop"o app dorme quando ocioso — a primeira request depois disso demora ~1-2s para acordar a VM. Para workloads sempre quentes, setarmin_machines_running = 1e acompanhar a cobrança emfly.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
rootou usuário comsudoDomínio próprio com um A-record apontando para o IP público do VPS (ex:
ekyte-mcp.seu-dominio.com→203.0.113.42)Portas
22,80e443liberadas 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 grupodockersó é aplicado em novas sessões. Sem isso, você vai precisar usarsudoem todo comandodocker.
Confira se ficou OK:
docker --version
docker compose versionPasso 2 — Clonar o repositório
git clone https://github.com/FerrazPiai/ekyte_mcp_server.git
cd ekyte_mcp_serverPasso 3 — Criar o arquivo .env
Na raiz do projeto, crie um .env baseado no .env.example:
cp .env.example .env
nano .envConteú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 -fEm outra sessão SSH (ou Ctrl+C nos logs), valide que o health check responde localmente:
curl http://localhost:3000/healthDeve 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 -yCrie o server block:
sudo nano /etc/nginx/sites-available/ekyte-mcpCole 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.comO 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.comantes 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 --buildO 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 22antes 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 userTeste: 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_idsempre é UUID (ex:00000000-0000-0000-0000-000000000001), nunca número — a skill lembra disso.Formato de datas correto:
AAAA-MM-DD(sem hora),HH:MMpara horários,end_time > start_timeem apontamentos.Confirmação em operações destrutivas: criar tarefa, completar tarefa, deletar apontamento, apontar horas — tudo pergunta antes de executar.
Performance: usa
searchnas listagens (evita paginar 600+ workspaces), filtralist_taskspor workspace_id, avisa quando listagem pode demorar (10-30s).Sabe a diferença entre
ekyte_update_task(fase atual) eekyte_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.mdWindows (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 devSmoke 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 escritaEndpoints que a MCP usa (referência)
Todos com Authorization: Bearer <jwt> e base https://api.ekyte.com:
Método | Path | Tool |
GET |
| list_workspaces |
GET |
| list_users |
GET |
| list_task_types |
GET |
| list_phases (retorna |
GET |
| list_tasks |
GET |
| get_task |
GET |
| list_task_flow_phases |
POST |
| create_task (suporta |
PATCH |
| update_task / complete_task |
PATCH |
| update_phase |
POST |
| add_task_comment |
GET |
| list_time_entries |
POST |
| create_time_entry_* |
PATCH |
| delete_time_entry |
Available Tools
21 toolsekyte_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.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | ID numérico da task no Ekyte. Use ekyte_list_tasks para descobrir o ID. | |
| comment | Yes | Texto do comentário a ser adicionado na tarefa |
TDQS
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.
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.
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.
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.
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.
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 EkyteADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | ID numérico da task no Ekyte. Use ekyte_list_tasks para descobrir o ID. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Nome do projeto | |
| workspaceId | Yes | ID do workspace onde o projeto será criado | |
| templateId | No | ID do modelo (template) do projeto, se houver | |
| startDate | No | Data de início no formato YYYY-MM-DD | |
| endDate | No | Data final no formato YYYY-MM-DD | |
| endpoint_override | No | Opcional: override da rota de criação. Padrão é 'projects'. | |
| additional_payload | No | Campos adicionais que podem ser requeridos pelo Ekyte para criar um projeto (JSON) |
TDQS
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.
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.
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.
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.
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.
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)ADestructive
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:
ekyte_list_workspaces → workspace_id
ekyte_list_task_types → task_type_id (+ workflow_id)
ekyte_list_phases(workflow_id) → phase_ids disponíveis
ekyte_list_users → executor_id (UUID)
Chamar este tool
IMPORTANTE: Sempre confirme TODOS os dados com o usuário antes de criar.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Título da nova tarefa | |
| workspace_id | Yes | ID numérico do workspace no Ekyte. Use ekyte_list_workspaces para descobrir o ID. | |
| task_type_id | Yes | ID do tipo de tarefa. Use ekyte_list_task_types para descobrir o ID. | |
| executor_id | No | UUID do responsável principal. Obrigatório se phases[] NÃO for fornecido. Se phases[] for fornecido, é ignorado. | |
| phase_id | No | ID da etapa/fase inicial. Obrigatório se phases[] NÃO for fornecido. Se phases[] for fornecido, é ignorado. | |
| estimated_time_minutes | No | Tempo estimado total em minutos (ex: 60 para 1 hora). Ignorado em multi-fase: soma dos esforços de phases[]. | |
| phase_start_date | Yes | Data de início padrão (AAAA-MM-DD). Cada fase pode sobrescrever em phases[]. | |
| phase_due_date | Yes | Data de entrega padrão (AAAA-MM-DD). Cada fase pode sobrescrever em phases[]. | |
| description | No | Descrição detalhada da tarefa (opcional) | |
| priority | No | Prioridade (0-1000). Ex: 100=Baixa, 300=Média, 500=Alta. Opcional. | |
| phases | No | MULTI-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
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.
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.
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.
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.
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.
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)ADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_id | Yes | ID numérico do workspace no Ekyte. Use ekyte_list_workspaces para descobrir o ID. | |
| task_type_id | Yes | ID do tipo de tarefa. Use ekyte_list_task_types para descobrir o ID. | |
| phase_id | Yes | ID da etapa. Obtido dos dados do tipo de tarefa. | |
| date | Yes | Data do apontamento no formato AAAA-MM-DD (ex: 2026-04-13) | |
| start_time | Yes | Hora de início no formato HH:MM (ex: 08:30) | |
| end_time | Yes | Hora de fim no formato HH:MM (ex: 13:08) | |
| comment | No | Comentário opcional sobre o apontamento | |
| non_productive | No | Se true, marca o apontamento como 'não produtivo' |
TDQS
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.
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.
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.
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.
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.
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íficaADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_id | Yes | ID numérico do workspace no Ekyte. Use ekyte_list_workspaces para descobrir o ID. | |
| task_id | Yes | ID numérico da task no Ekyte. Use ekyte_list_tasks para descobrir o ID. | |
| date | Yes | Data do apontamento no formato AAAA-MM-DD (ex: 2026-04-13) | |
| start_time | Yes | Hora de início no formato HH:MM (ex: 08:30) | |
| end_time | Yes | Hora de fim no formato HH:MM (ex: 13:08) | |
| comment | No | Comentário opcional sobre o apontamento | |
| manual_time | No | Horário manual de referência no formato HH:MM (opcional) |
TDQS
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.
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.
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.
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.
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.
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 HorasADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_id | Yes | ID numérico do workspace no Ekyte. Use ekyte_list_workspaces para descobrir o ID. | |
| time_entry_id | Yes | ID numérico do apontamento a ser deletado. Use ekyte_list_time_entries para descobrir o ID. |
TDQS
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.
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.
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.
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.
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.
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 TarefaARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | ID numérico da task no Ekyte. Use ekyte_list_tasks para descobrir o ID. | |
| response_format | No | Formato de saída | markdown |
TDQS
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.
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.
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.
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.
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.
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 WorkflowARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| workflow_id | Yes | ID do workflow. Obtenha via ekyte_list_task_types (campo workflow_id). | |
| response_format | No | Formato de saída | markdown |
TDQS
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.
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.
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.
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.
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.
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 EkyteARead-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').
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Número da página (inicia em 1). Cada página retorna até 100 registros. | |
| response_format | No | Formato de saída: 'markdown' para leitura humana ou 'json' para dados estruturados | markdown |
| search | No | Busca por nome do projeto | |
| workspace_id | No | ID do workspace para filtrar os projetos | |
| status | No | Filtrar por status do projeto (situation) | |
| is_planning | No | Use 1 para filtrar projetos que são apenas planejamento (tarefas planejadas não ativas), 0 para não-planejamento | |
| endpoint_override | No | Opcional: override da rota da API (ex: 'projects', 'ctc-projects', 'plans'). Padrão é 'projects'. |
TDQS
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.
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.
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.
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.
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.
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 ProjetoARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Número da página (inicia em 1). Cada página retorna até 100 registros. | |
| response_format | No | Formato de saída: 'markdown' para leitura humana ou 'json' para dados estruturados | markdown |
| project_id | Yes | ID do projeto (obtido via ekyte_list_projects) | |
| search | No | Filtrar por nome da tarefa | |
| status | No | Filtrar por status da tarefa |
TDQS
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.
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.
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.
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.
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.
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 ProjetosBRead-onlyIdempotent
Lista modelos (templates) de projetos disponíveis para criar novos projetos.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Número da página (inicia em 1). Cada página retorna até 100 registros. | |
| response_format | No | Formato de saída: 'markdown' para leitura humana ou 'json' para dados estruturados | markdown |
| search | No | Busca por nome do modelo/template | |
| endpoint_override | No | Opcional: override da rota da API (ex: 'projects'). Padrão é 'projects'. |
TDQS
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.
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.
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.
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.
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.
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)ARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | ID numérico da task no Ekyte. Use ekyte_list_tasks para descobrir o ID. | |
| project_id | No | ID do projeto (necessário se for uma tarefa de projeto). Tarefas avulsas não precisam. | |
| response_format | No | Formato de saída | markdown |
TDQS
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.
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.
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.
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.
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.
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 EkyteARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Filtro de texto (case-insensitive) no título da tarefa. Ex: 'playbook'. | |
| workspace_id | No | ID do workspace para filtrar. Use ekyte_list_workspaces para descobrir. | |
| status | No | Filtro por situação: 10=Ativas, 20=Pausadas, 30=Concluídas, 40=Canceladas. Padrão: 10 (Ativas) | |
| task_type_id | No | ID do tipo de tarefa para filtrar. Use ekyte_list_task_types para descobrir. | |
| phase_id | No | ID da etapa atual para filtrar. | |
| executor_id | No | UUID do responsável para filtrar. Use ekyte_list_users para descobrir. | |
| created_from | No | Filtrar tasks criadas a partir desta data (AAAA-MM-DD) | |
| created_to | No | Filtrar tasks criadas até esta data (AAAA-MM-DD) | |
| due_from | No | Filtrar por data de entrega a partir de (AAAA-MM-DD) | |
| due_to | No | Filtrar por data de entrega até (AAAA-MM-DD) | |
| page | No | Página do resultado filtrado (paginação client-side, 50 por página). | |
| response_format | No | Formato de saída | markdown |
TDQS
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.
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.
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.
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.
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.
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 EkyteARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Filtro de texto (case-insensitive) no nome do tipo de tarefa. Ex: 'onboarding'. | |
| active_only | No | Se true, retorna só tipos ativos (active=1). | |
| page | No | Página do resultado filtrado (paginação client-side, 50 por página). | |
| response_format | No | Formato de saída | markdown |
TDQS
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.
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.
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.
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.
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.
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 HorasARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_id | Yes | ID numérico do workspace no Ekyte. Use ekyte_list_workspaces para descobrir o ID. | |
| date_from | Yes | Data inicial do filtro no formato AAAA-MM-DD (obrigatório) | |
| date_to | Yes | Data final do filtro no formato AAAA-MM-DD (obrigatório) | |
| user_id | No | UUID do usuário para filtrar apontamentos. Use ekyte_list_users para descobrir. | |
| task_id | No | ID da tarefa para filtrar apontamentos específicos dela. | |
| page | No | Página do resultado (paginação client-side, 50 por página). | |
| response_format | No | Formato de saída | markdown |
TDQS
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.
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.
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.
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.
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.
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 EkyteARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Filtro de texto (case-insensitive) por nome ou email. | |
| page | No | Página do resultado filtrado (paginação client-side, 50 por página). | |
| response_format | No | Formato de saída | markdown |
TDQS
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.
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.
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.
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.
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.
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 EkyteARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Filtro de texto (case-insensitive) no nome do workspace. Ex: 'ferraz' acha 'V4 Ferraz Piai'. | |
| active_only | No | Se true, retorna só workspaces ativos (active=1). | |
| page | No | Página do resultado filtrado (paginação client-side, 50 por página). | |
| response_format | No | Formato de saída | markdown |
TDQS
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.
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.
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.
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.
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.
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 ProjetoADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | ID numérico da task no Ekyte. Use ekyte_list_tasks para descobrir o ID. | |
| project_id | Yes | ID do projeto. Obrigatório — esta operação só funciona para tarefas de projeto. | |
| phase_id | Yes | ID da fase (phaseId) a ativar ou desativar. Use ekyte_list_task_flow_phases para listar as fases e seus IDs. | |
| active | Yes | 1 = ATIVAR a fase (adicionar ao fluxo). 0 = DESATIVAR a fase (remover do fluxo). | |
| executor_id | No | UUID do executor para esta fase. Opcional ao desativar, recomendado ao ativar. |
TDQS
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.
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.
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.
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.
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.
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)ADestructiveIdempotent
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:
ekyte_list_task_flow_phases(task_id) → ver todas as fases e seus phase_ids
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.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | ID numérico da task no Ekyte. Use ekyte_list_tasks para descobrir o ID. | |
| project_id | No | ID do projeto (necessário APENAS se for uma tarefa de projeto). Tarefas avulsas não precisam disso. | |
| phase_id | Yes | ID da fase a atualizar dentro desta tarefa. Use ekyte_list_task_flow_phases para ver as fases e seus IDs. | |
| executor_id | No | Novo responsável (UUID) para ESTA FASE específica. Opcional. | |
| effort_minutes | No | Novo tempo estimado desta fase em minutos. Opcional. | |
| phase_start_date | No | Nova data de início desta fase (AAAA-MM-DD). Opcional. | |
| phase_due_date | No | Nova data de entrega desta fase (AAAA-MM-DD). Opcional. |
TDQS
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.
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.
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.
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.
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.
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)ADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | ID numérico da task no Ekyte. Use ekyte_list_tasks para descobrir o ID. | |
| project_id | No | ID do projeto (necessário APENAS se for uma tarefa de projeto). Tarefas avulsas não precisam disso. | |
| title | No | Novo título da tarefa (opcional) | |
| description | No | Nova descrição da tarefa em texto simples (será convertido para HTML). Opcional. | |
| executor_id | No | UUID 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_id | No | ID da nova fase ATIVA da tarefa (opcional). Use ekyte_list_task_flow_phases para ver as fases disponíveis. | |
| phase_start_date | No | Nova data de início da etapa atual (AAAA-MM-DD). Opcional. | |
| phase_due_date | No | Nova data de entrega da etapa atual (AAAA-MM-DD). Opcional. | |
| priority_group | No | Grupo de prioridade (0-100). É o campo que a UI do Ekyte usa: 35=Baixa, 50=Média, 60=Alta, 90=Urgente. Opcional. | |
| priority | No | Prioridade numérica bruta (0-1000). Normalmente você quer priority_group em vez disso. Opcional. |
TDQS
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.
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.
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.
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.
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.
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
Most tools have distinct purposes, but `ekyte_list_phases` and `ekyte_list_task_flow_phases` could be confused despite descriptions clarifying the difference.
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.
21 tools cover tasks, projects, time entries, workspaces, and users without being excessive; each tool serves a clear operational need.
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
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
Secure AI access to OpenOak tasks, notes, and Kanban boards.
Connect Claude to your Platform7n workspaces — chat, links, and tasks. One-click OAuth.
Connect Claude AI to UluP Spaces via MCP — create projects, nodes, and tasks with OAuth 2.0.
Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables Claude Desktop to interact with the Academiadepolitie.com platform, allowing users to query their profile using a JWT token.
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with EverHour's API for time tracking, project management, task management, expense tracking, and reporting.
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants like Claude to interact with your SiYuan knowledge base through a secure, authenticated API.1052MIT
- FlicenseCqualityCmaintenanceConnects Claude to a local project management API, enabling task, project, and user management through natural language.46
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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