worklog-mcp
English documentation comes first because GitHub commonly presents repository content in English. A Portuguese version is available below.
- English
- Português
English
worklog-mcp is an MCP (Model Context Protocol) server for logging and checking worklogs from multiple task management providers (Jira Cloud, Redmine, GitHub, Artia) using AI agents such as Claude Code, Claude Desktop, Cursor, or any MCP client that supports stdio.
The main workflow is simple: paste time-sheet rows into your agent, review the preview, and let the agent call this server to log each work item in the right issue on your preferred provider.
How It Works
MCP client -> stdio JSON-RPC -> worklog-mcp -> HTTPS -> Task Provider API
(Jira Cloud, Redmine, GitHub, Artia)
- Transport: local stdio. No HTTP server and no open port.
- Providers: select your task management system via
WORK_PROVIDERenv variable (default:jira). - Auth: provider-specific credentials from environment variables or
.env. - Config: loaded from
.env(optional) or from the MCP client environment. - Layers: client modules (
src/jira_client.py,src/redmine_client.py, etc.) handle provider-specific API calls;src/providers/adapts them behind a commonTaskProviderinterface;src/tools/exposes FastMCP tools;src/server.pywires them together. The rootserver.pyis a thin launcher.
Tools
This server exposes exactly seven tools. Availability and behavior depend on the selected provider and its capabilities. By design, all tools are read/append only (least privilege) — no ability to create, edit, transition, assign, or delete issues, comments, or worklogs.
| Tool | Purpose | Notes |
|---|---|---|
whoami |
Validates authentication and returns the current identity when the provider allows it. | Available on all providers. |
search_tasks |
Searches tasks. No args returns your open/assigned tasks; query does text search; native_query runs provider-specific syntax (JQL for Jira, etc.). |
Available on all providers. |
get_task |
Returns a compact view of one task (key, summary, status, type, assignee, priority, labels, description text). | Available on all providers. |
add_comment |
Adds a comment to a task. Plain text is converted to provider-specific format (ADF for Jira, markdown for GitHub, etc.). | Depends on provider capabilities. |
log_work |
Logs one worklog. time_spent accepts 2:40 or 1h 30m. Provider-specific extras like issue_key="daily" (Jira) may apply. |
Depends on provider capabilities. |
log_work_batch |
Logs multiple worklogs in one call. Skips entries already logged at the same date/time and returns them for confirmation. | Depends on provider capabilities. |
get_worklogs |
Lists worklogs from a task. mine_only filters your entries when identity is available. |
Depends on provider capabilities. |
Requirements
- uv, recommended for Python and dependency management.
- An account on your chosen provider (Jira Cloud, Redmine, GitHub, or Artia) with permission to log work on target tasks.
- API token or credentials for your provider (varies by provider).
Install uv on Windows:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
Supported Providers
- Jira Cloud (
jira): Log work on Jira issues. Supports daily bucket feature via JQL template. - Redmine (
redmine): Log work on Redmine issues. - GitHub (
github): Log work on GitHub issues and pull requests. - Artia (
artia): Log work on Artia tasks.
Installation
git clone <repo-url> worklog-mcp
cd worklog-mcp
cp .env.example .env
uv sync
Edit .env with credentials for your selected provider.
Do not commit .env. It is already ignored by .gitignore.
Provider-Specific Setup
Jira Cloud
- Create a Jira API token at: https://id.atlassian.com/manage-profile/security/api-tokens
- Store the token in
JIRA_API_TOKENenv variable or.envfile. - Set
WORK_PROVIDER=jiraand configureJIRA_BASE_URL,JIRA_EMAIL.
Redmine
- Log in to Redmine and go to your Account settings.
- Generate or copy your API key from the right sidebar.
- Store in
REDMINE_API_KEYand configureREDMINE_URL. - Set
WORK_PROVIDER=redmine.
GitHub
- Create a personal access token at: https://github.com/settings/tokens
- Grant permissions:
repo,userscopes. - Store in
GITHUB_TOKENenv variable. - Set
WORK_PROVIDER=github.
Artia
- Generate integration keys in Artia (ClientId + Secret).
- Store in
ARTIA_CLIENT_IDandARTIA_SECRET. - Configure
ARTIA_API_URL(optional; default ishttps://api.artia.com/graphql). - Set
ARTIA_ACCOUNT_ID(required) and optionallyARTIA_FOLDER_ID. - Set
WORK_PROVIDER=artia.
Local Test
Start the server directly:
uv run server.py
For a quick auth check on the active provider:
uv run python -c "from src.services.provider_registry import registry; print(registry.get().whoami())"
To test a different provider, set WORK_PROVIDER:
$env:WORK_PROVIDER = "redmine"
uv run python -c "from src.services.provider_registry import registry; print(registry.get().whoami())"
MCP Client Registration
Keep machine-specific paths outside Git. Define them as environment variables in your shell, OS profile, or MCP client environment:
$env:UV_PATH = "C:/path/to/uv.exe"
$env:MCP_PROJECT_DIR = "C:/path/to/worklog-mcp"
$env:WORK_PROVIDER = "jira" # or redmine, github, artia
Example: Register with Jira provider via Claude Code
claude mcp add worklog --scope user `
-e WORK_PROVIDER=jira `
-e JIRA_BASE_URL=https://your-company.atlassian.net `
-e [email protected] `
-e JIRA_API_TOKEN=your-token `
-- $env:UV_PATH --directory $env:MCP_PROJECT_DIR run server.py
Example: Register with Redmine provider
claude mcp add worklog --scope user `
-e WORK_PROVIDER=redmine `
-e REDMINE_URL=https://redmine.example.com `
-e REDMINE_API_KEY=your-key `
-- $env:UV_PATH --directory $env:MCP_PROJECT_DIR run server.py
Claude Desktop, Cursor, or another stdio MCP client configuration
Create or edit %APPDATA%\Claude\claude_desktop_config.json (on Windows):
{
"mcpServers": {
"worklog": {
"command": "powershell",
"args": [
"-NoProfile",
"-ExecutionPolicy",
"Bypass",
"-Command",
"& $env:UV_PATH --directory $env:MCP_PROJECT_DIR run server.py"
],
"env": {
"WORK_PROVIDER": "jira",
"JIRA_BASE_URL": "https://your-company.atlassian.net",
"JIRA_EMAIL": "[email protected]",
"JIRA_API_TOKEN": "your-token"
}
}
}
}
Alternatively, use .env file in the repository root instead of passing credentials via environment.
Time-Sheet Workflow
The agent translates your pasted time-sheet block into tool calls. The server only exposes the primitives.
- Use the reference date you provide. If none is provided, the agent should ask.
- Classify each row:
- Starts with a task key like
PROJ-123: log work to that task. - Has no task key: find it first with
search_tasks, or skip it and report it in the preview.
- Starts with a task key like
- Show a preview with task key, duration, start time, and comment.
- After confirmation, call
log_work_batch. Entries that already have a worklog at the same date/time are skipped and returned underskipped_duplicates; decide per entry whether to log them anyway withlog_work.
Note: Provider-specific features like Jira's issue_key="daily" are handled automatically by the server.
Environment Variables
Provider Selection
| Variable | Default | Description |
|---|---|---|
WORK_PROVIDER |
jira |
Active provider: jira, redmine, github, or artia. |
Jira Cloud (when WORK_PROVIDER=jira)
| Variable | Required | Description |
|---|---|---|
JIRA_BASE_URL |
yes | Jira Cloud URL, must be HTTPS and a *.atlassian.net host, for example https://your-company.atlassian.net. |
JIRA_EMAIL |
yes | Atlassian account email. |
JIRA_API_TOKEN |
yes | Jira API token. |
JIRA_DAILY_JQL |
no | JQL that resolves issue_key="daily" to a recurring monthly bucket issue. Use {month} (Portuguese month name) and {year}, filled from the worklog date, e.g. project = MYPROJ AND summary ~ "Timesheet {month} de {year}" ORDER BY created DESC. Unset disables the feature. |
Redmine (when WORK_PROVIDER=redmine)
| Variable | Required | Description |
|---|---|---|
REDMINE_URL |
yes | Redmine base URL, e.g. https://redmine.example.com. |
REDMINE_API_KEY |
yes | Redmine API key. |
GitHub (when WORK_PROVIDER=github)
| Variable | Required | Description |
|---|---|---|
GITHUB_TOKEN |
yes | GitHub personal access token (PAT). |
Artia (when WORK_PROVIDER=artia)
| Variable | Required | Description |
|---|---|---|
ARTIA_API_URL |
no | Artia GraphQL URL. Default: https://api.artia.com/graphql. |
ARTIA_CLIENT_ID |
yes | Artia integration ClientId. |
ARTIA_SECRET |
yes | Artia integration Secret. |
ARTIA_ACCOUNT_ID |
yes | Account/workspace id used for get_task/worklogs. |
ARTIA_FOLDER_ID |
no | Default folder id for search_tasks. |
ARTIA_WORKLOG_STATUS_ID |
no | Optional status id sent when creating a time entry. |
The required variables for your chosen provider are read from .env (optional) or from the MCP client environment. No .env file is required.
Security
- Least privilege: the server is read/append only. It cannot create, edit, transition, assign, or delete tasks, comments, or worklogs. No tool maps to a destructive endpoint.
- Provider URLs validated: Only HTTPS URLs are accepted. Provider URLs (Jira, Redmine, etc.) are validated for correctness.
- Credentials not stored in code: They come from environment variables;
.envis optional and ignored by Git. - One shared, pooled HTTP client with fixed timeout and connection limits per provider instance.
- Local machine paths should stay in environment variables such as
UV_PATHandMCP_PROJECT_DIR. - Local stdio transport: the server does not open an inbound network port.
Development
uv run pytest -q
Tests use respx to mock HTTP calls to various providers. They do not call real provider APIs.
Project layout:
worklog-mcp/
pyproject.toml
.env.example
server.py # thin launcher -> src/server.py
src/
server.py # FastMCP app, registers tools
config.py # loads .env, selects provider
jira_client.py # Jira REST v3 HTTP client
redmine_client.py # Redmine API client
github_client.py # GitHub REST API client
artia_client.py # Artia API client
utils.py
models/ # Task, Comment, Worklog, ProviderCapabilities
providers/
base.py # TaskProvider protocol and BaseProvider
jira_provider.py # Jira Cloud provider
redmine_provider.py # Redmine provider
github_provider.py # GitHub provider
artia_provider.py # Artia provider
services/
provider_registry.py # lazily-built provider instances
tools/ # one module per MCP tool
tests/
Architecture
- Provider interface (
src/providers/base.py):TaskProviderprotocol defines the contract. Each provider implements required methods (whoami,search_tasks,get_task) and optional ones gated bycapabilities(add_comment,log_work,get_worklogs). - Provider registry (
src/services/provider_registry.py): Lazily instantiates and caches provider instances based onWORK_PROVIDERenv variable. - Tools (
src/tools/): Seven FastMCP tools that call the active provider through the registry.
Troubleshooting
The MCP client shows the server as failed.
Run uv run server.py from the repository and check the error. Common causes are missing environment variables, uv not available to the launcher, or an incorrect MCP_PROJECT_DIR.
Authentication fails with invalid credentials error.
Check that you are using the correct provider and that the credentials are valid:
- For Jira:
JIRA_BASE_URL,JIRA_EMAIL,JIRA_API_TOKEN. - For Redmine:
REDMINE_URL,REDMINE_API_KEY. - For GitHub:
GITHUB_TOKEN. - For Artia:
ARTIA_CLIENT_ID,ARTIA_SECRET,ARTIA_ACCOUNT_ID.
Generate a new token if needed.
Worklog was created on one provider but I expected another.
Check the WORK_PROVIDER environment variable. Default is jira. Set it explicitly if needed.
A worklog was created but does not appear in the company timesheet.
Your company may use a separate timesheet app (e.g., Tempo Timesheets for Jira, etc.). This server writes native provider worklogs.
Português
worklog-mcp é um servidor MCP (Model Context Protocol) para lançar e conferir horas em múltiplos provedores de gestão de tarefas (Jira Cloud, Redmine, GitHub, Artia) a partir de agentes de IA como Claude Code, Claude Desktop, Cursor ou qualquer cliente MCP via stdio.
O fluxo principal é simples: cole as linhas da sua planilha de horas no agente, confira o preview, e deixe o agente chamar este servidor para registrar cada item na ferramenta correta.
Como Funciona
Cliente MCP -> stdio JSON-RPC -> worklog-mcp -> HTTPS -> API do Provedor
(Jira Cloud, Redmine, GitHub, Artia)
- Transporte: stdio local. Sem servidor HTTP e sem porta aberta.
- Provedores: selecione sua ferramenta via variável
WORK_PROVIDER(padrão:jira). - Autenticação: credenciais específicas do provedor de variáveis de ambiente ou
.env. - Configuração: vem de variáveis de ambiente, lidas do
.env(opcional) ou passadas pelo cliente MCP. - Camadas: módulos de cliente (
src/jira_client.py,src/redmine_client.py, etc.) conversam com APIs específicas;src/providers/adapta para uma interface comumTaskProvider;src/tools/expõe as tools FastMCP;src/server.pyliga tudo. Oserver.pyda raiz é só um launcher.
Tools
Este servidor expõe exatamente sete tools. A disponibilidade e comportamento dependem do provedor selecionado e suas capacidades. Por design, todas as tools são somente leitura/append (menor privilégio) — não conseguem criar, editar, transicionar, atribuir nem apagar tarefas, comentários ou worklogs.
| Tool | Finalidade | Notas |
|---|---|---|
whoami |
Valida a autenticação e retorna a identidade atual quando o provedor permite. | Disponível em todos os provedores. |
search_tasks |
Busca tarefas. Sem args retorna suas abertas/atribuídas; query faz busca textual; native_query executa sintaxe específica do provedor (JQL para Jira, etc.). |
Disponível em todos os provedores. |
get_task |
Retorna uma visão compacta de uma tarefa (chave, resumo, status, tipo, responsável, prioridade, labels, texto da descrição). | Disponível em todos os provedores. |
add_comment |
Adiciona um comentário a uma tarefa. Texto simples é convertido para formato específico do provedor (ADF para Jira, markdown para GitHub, etc.). | Depende das capacidades do provedor. |
log_work |
Lança um worklog. time_spent aceita 2:40 ou 1h 30m. Extras específicos do provedor como issue_key="daily" (Jira) podem ser aplicados. |
Depende das capacidades do provedor. |
log_work_batch |
Lança vários worklogs em uma chamada. Pula lançamentos já existentes no mesmo dia/horário e os devolve para confirmação. | Depende das capacidades do provedor. |
get_worklogs |
Lista worklogs de uma tarefa. mine_only filtra os seus quando a identidade está disponível. |
Depende das capacidades do provedor. |
Pré-Requisitos
- uv, recomendado para gerenciar Python e dependências.
- Conta em seu provedor escolhido (Jira Cloud, Redmine, GitHub ou Artia) com permissão para lançar horas nas tarefas.
- API token ou credenciais para seu provedor (varia por provedor).
Instale o uv no Windows:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
Provedores Suportados
- Jira Cloud (
jira): Lança horas em issues do Jira. Suporta feature de tarefa-balde diária via template JQL. - Redmine (
redmine): Lança horas em issues do Redmine. - GitHub (
github): Lança horas em issues e pull requests do GitHub. - Artia (
artia): Lança horas em tarefas do Artia.
Instalação
git clone <url-do-repo> worklog-mcp
cd worklog-mcp
cp .env.example .env
uv sync
Edite o .env com as credenciais do provedor selecionado.
Não commite o .env. Ele já está no .gitignore.
Setup Específico Do Provedor
Jira Cloud
- Crie um token API do Jira em: https://id.atlassian.com/manage-profile/security/api-tokens
- Guarde o token em
JIRA_API_TOKENou no arquivo.env. - Configure
WORK_PROVIDER=jirae definaJIRA_BASE_URL,JIRA_EMAIL.
Redmine
- Faça login no Redmine e vá para Configurações da Conta.
- Gere ou copie sua chave API da barra lateral direita.
- Guarde em
REDMINE_API_KEYe configureREDMINE_URL. - Configure
WORK_PROVIDER=redmine.
GitHub
- Crie um token de acesso pessoal em: https://github.com/settings/tokens
- Conceda permissões: escopos
repoeuser. - Guarde em
GITHUB_TOKEN. - Configure
WORK_PROVIDER=github.
Artia
- Gere chaves de integração no Artia (ClientId + Secret).
- Guarde em
ARTIA_CLIENT_IDeARTIA_SECRET. - Configure
ARTIA_API_URL(opcional; padrãohttps://api.artia.com/graphql). - Defina
ARTIA_ACCOUNT_ID(obrigatório) e opcionalmenteARTIA_FOLDER_ID. - Configure
WORK_PROVIDER=artia.
Teste Local
Suba o servidor diretamente:
uv run server.py
Para testar autenticação rapidamente no provedor ativo:
uv run python -c "from src.services.provider_registry import registry; print(registry.get().whoami())"
Para testar um provedor diferente, configure WORK_PROVIDER:
$env:WORK_PROVIDER = "redmine"
uv run python -c "from src.services.provider_registry import registry; print(registry.get().whoami())"
Registro Em Cliente MCP
Mantenha caminhos específicos da sua máquina fora do Git. Defina-os como variáveis de ambiente no shell, no perfil do sistema ou no ambiente do cliente MCP:
$env:UV_PATH = "C:/caminho/para/uv.exe"
$env:MCP_PROJECT_DIR = "C:/caminho/para/worklog-mcp"
$env:WORK_PROVIDER = "jira" # ou redmine, github, artia
Exemplo: Registrar com provedor Jira via Claude Code
claude mcp add worklog --scope user `
-e WORK_PROVIDER=jira `
-e JIRA_BASE_URL=https://sua-empresa.atlassian.net `
-e [email protected] `
-e JIRA_API_TOKEN=seu-token `
-- $env:UV_PATH --directory $env:MCP_PROJECT_DIR run server.py
Exemplo: Registrar com provedor Redmine
claude mcp add worklog --scope user `
-e WORK_PROVIDER=redmine `
-e REDMINE_URL=https://redmine.example.com `
-e REDMINE_API_KEY=sua-chave `
-- $env:UV_PATH --directory $env:MCP_PROJECT_DIR run server.py
Claude Desktop, Cursor ou outro cliente MCP via stdio
Edite %APPDATA%\Claude\claude_desktop_config.json (no Windows):
{
"mcpServers": {
"worklog": {
"command": "powershell",
"args": [
"-NoProfile",
"-ExecutionPolicy",
"Bypass",
"-Command",
"& $env:UV_PATH --directory $env:MCP_PROJECT_DIR run server.py"
],
"env": {
"WORK_PROVIDER": "jira",
"JIRA_BASE_URL": "https://sua-empresa.atlassian.net",
"JIRA_EMAIL": "[email protected]",
"JIRA_API_TOKEN": "seu-token"
}
}
}
}
Alternativamente, use arquivo .env na raiz do repositório em vez de passar credenciais via ambiente.
Fluxo Da Planilha
O agente traduz o bloco colado da planilha em chamadas de tools. O servidor apenas expõe as primitivas.
- Usa a data de referência que você informar. Se não informar, o agente deve perguntar.
- Classifica cada linha:
- Começa com chave de tarefa, como
PROJ-123: lança na tarefa. - Não tem chave: acha a tarefa antes com
search_tasks, ou pula e mostra no preview.
- Começa com chave de tarefa, como
- Mostra preview com tarefa, duração, início e comentário.
- Depois da confirmação, chama
log_work_batch. Lançamentos já existentes no mesmo dia/horário são pulados e devolvidos emskipped_duplicates; você decide por linha se quer lançar mesmo assim vialog_work.
Nota: Recursos específicos do provedor como issue_key="daily" do Jira são manipulados automaticamente pelo servidor.
Variáveis De Ambiente
Seleção De Provedor
| Variável | Padrão | Descrição |
|---|---|---|
WORK_PROVIDER |
jira |
Provedor ativo: jira, redmine, github ou artia. |
Jira Cloud (quando WORK_PROVIDER=jira)
| Variável | Obrigatória | Descrição |
|---|---|---|
JIRA_BASE_URL |
sim | URL do Jira Cloud, precisa ser HTTPS e um host *.atlassian.net, por exemplo https://sua-empresa.atlassian.net. |
JIRA_EMAIL |
sim | Email da conta Atlassian. |
JIRA_API_TOKEN |
sim | API token do Jira. |
JIRA_DAILY_JQL |
não | JQL que resolve issue_key="daily" para a tarefa-balde mensal. Use {month} (nome do mês em PT) e {year}, preenchidos pela data do worklog, ex. project = MYPROJ AND summary ~ "Timesheet {month} de {year}" ORDER BY created DESC. Vazio desliga o recurso. |
Redmine (quando WORK_PROVIDER=redmine)
| Variável | Obrigatória | Descrição |
|---|---|---|
REDMINE_URL |
sim | URL base do Redmine, ex. https://redmine.example.com. |
REDMINE_API_KEY |
sim | Chave API do Redmine. |
GitHub (quando WORK_PROVIDER=github)
| Variável | Obrigatória | Descrição |
|---|---|---|
GITHUB_TOKEN |
sim | Token de acesso pessoal (PAT) do GitHub. |
Artia (quando WORK_PROVIDER=artia)
| Variável | Obrigatória | Descrição |
|---|---|---|
ARTIA_API_URL |
não | URL GraphQL do Artia. Padrão: https://api.artia.com/graphql. |
ARTIA_CLIENT_ID |
sim | ClientId da integração Artia. |
ARTIA_SECRET |
sim | Secret da integração Artia. |
ARTIA_ACCOUNT_ID |
sim | ID da conta/workspace usado em get_task/worklogs. |
ARTIA_FOLDER_ID |
não | ID da pasta padrão para search_tasks. |
ARTIA_WORKLOG_STATUS_ID |
não | ID de status opcional enviado ao criar apontamento. |
As variáveis obrigatórias para seu provedor escolhido são lidas do .env (opcional) ou do ambiente do cliente MCP. Nenhum arquivo .env é obrigatório.
Segurança
- Menor privilégio: o servidor é somente leitura/append. Não cria, edita, transiciona, atribui nem apaga tarefas, comentários ou worklogs. Nenhuma tool aponta para um endpoint destrutivo.
- URLs dos provedores validadas: Apenas HTTPS. URLs dos provedores (Jira, Redmine, etc.) são validadas.
- Credenciais não ficam no código: Vêm de variáveis de ambiente;
.envé opcional e ignorado pelo Git. - Um único
httpx.Clientcompartilhado com pool, timeout fixo e limites de conexão por instância de provedor. - Caminhos locais da máquina devem ficar em variáveis como
UV_PATHeMCP_PROJECT_DIR. - Transporte stdio local: não abre porta de rede.
Desenvolvimento
uv run pytest -q
Os testes usam respx para mockar chamadas HTTP em vários provedores. Eles não chamam APIs reais.
Estrutura:
worklog-mcp/
pyproject.toml
.env.example
server.py # launcher fino -> src/server.py
src/
server.py # app FastMCP, registra as tools
config.py # carrega .env, seleciona o provedor
jira_client.py # cliente HTTP da REST v3 do Jira
redmine_client.py # cliente API do Redmine
github_client.py # cliente REST API do GitHub
artia_client.py # cliente API do Artia
utils.py
models/ # Task, Comment, Worklog, ProviderCapabilities
providers/
base.py # protocolo TaskProvider e BaseProvider
jira_provider.py # provedor Jira Cloud
redmine_provider.py # provedor Redmine
github_provider.py # provedor GitHub
artia_provider.py # provedor Artia
services/
provider_registry.py # instâncias de provedores lazy-loaded
tools/ # um módulo por tool MCP
tests/
Arquitetura
- Interface de provedor (
src/providers/base.py): protocoloTaskProviderdefine o contrato. Cada provedor implementa métodos obrigatórios (whoami,search_tasks,get_task) e opcionais controlados porcapabilities(add_comment,log_work,get_worklogs). - Registry de provedor (
src/services/provider_registry.py): instancia e cacheia preguiçosamente os provedores baseado na variávelWORK_PROVIDER. - Tools (
src/tools/): Sete tools FastMCP que chamam o provedor ativo através do registry.
Troubleshooting
O cliente MCP mostra o servidor como failed.
Rode uv run server.py no repositório e veja o erro. Causas comuns: variáveis de ambiente ausentes, uv indisponível para o launcher ou MCP_PROJECT_DIR incorreto.
Autenticação falha com erro de credenciais inválidas.
Confira que você está usando o provedor correto e que as credenciais são válidas:
- Para Jira:
JIRA_BASE_URL,JIRA_EMAIL,JIRA_API_TOKEN. - Para Redmine:
REDMINE_URL,REDMINE_API_KEY. - Para GitHub:
GITHUB_TOKEN. - Para Artia:
ARTIA_CLIENT_ID,ARTIA_SECRET,ARTIA_ACCOUNT_ID.
Gere um token novo se necessário.
Worklog foi lançada em um provedor mas eu esperava outro.
Confira a variável de ambiente WORK_PROVIDER. O padrão é jira. Configure explicitamente se necessário.
A hora foi lançada mas não aparece no timesheet da empresa.
Sua empresa pode usar um app separado (ex. Tempo Timesheets para Jira, etc.). Este servidor grava worklogs nativos do provedor.