TiFlux MCP Server
OfficialThe TiFlux MCP Server connects AI clients to a TiFlux helpdesk account, enabling full service management operations through natural language — no software installation required.
Ticket Management
Create, get, update, close, cancel, reopen, and list tickets with advanced filters (desk, client, requestor, SLA, priority, date range, etc.)
Compare ticket counts between time periods with trend analysis
Update custom fields (entities) on tickets
Ticket Communications & Files
Create, list, get, update, and delete client-facing answers and internal communications
Upload, list, and delete file attachments on tickets or ticket answers
View full ticket event history and SLA history per stage
Time Tracking (Appointments)
Create and list work-hour records on tickets, with filters by user, date range, and valorization details
Chat (WhatsApp) Management
List chats by state: inbox, assigned, in-attendance, and archived
Transfer chats to another attendant or department, or link to a ticket
Send WhatsApp messages (free text or HSM templates)
Archive/finish chat sessions
Client Management
Search, list, get, create, and update clients (companies)
Manage associated desks, technical groups, portal users, email/domain permissions, and custom fields
Requestor Management
Search, list, get, create, update requestors, and manage their custom fields
User & Agent Management (Admin)
Search, get, create, and update agents/attendants, including license and technical group management
Desk & Catalog Exploration
List and inspect desks (SLA, required fields, behavior), priorities, and service catalogs
Search catalog items and stages by keyword within a desk
Custom Fields Discovery
List entity groups, fields, and field options to correctly populate custom forms
Knowledge Base
List and create articles with tags, folders, and access control
Contracts
List organization contracts with filters by client, type, and status (read-only)
Departments
List departments to discover IDs for chat filtering
Smart Features
Automatic fuzzy name resolution for desks, stages, catalog items, clients, requestors, and users
Verbosity control (
richorcompact) to optimize token usageSupports both OAuth 2.0 and API key authentication
Permite enviar mensagens WhatsApp e gerenciar chats do WhatsApp como parte do sistema de chat do TiFlux, incluindo listagem de chats por origem WhatsApp, envio de mensagens e finalização de atendimentos.
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., "@TiFlux MCP Servershow me open tickets for desk 'Support'"
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.
Tiflux MCP Server
Conecte Claude, ChatGPT e outros clientes de IA à sua conta Tiflux para abrir, atualizar e consultar tickets em seu nome — sem instalar nada. Servidor MCP (Model Context Protocol) hospedado em https://mcp.tiflux.com.
English: this README is primarily in Portuguese (pt-BR). The full tool catalog (Available Tools) is in English, and local usage via
npxis documented under Avançado: execução local.
Pré-requisitos e modelo de uso
Licença API ativa na sua conta Tiflux — é o único pré-requisito para usar o MCP.
Como gerar sua chave de API:
Acesse o Tiflux e faça login em app.tiflux.com
Clique na sua foto no canto superior direito → Minha conta
Abra a aba Sessões
Em Sessões API, clique em "Gerar novo token de sessão"
Copie a chave gerada — é ela que você vai usar para conectar
Todas as ações feitas via MCP — abrir e movimentar tickets, responder, criar apontamentos etc. — sãoregistradas em nome do usuário dono da chave de API. Para uso operacional no dia a dia, cada pessoa da equipe deve ter sua própria licença API e sua própria chave. Não compartilhe uma mesma chave entre vários usuários.
Related MCP server: rt-mcp
Como conectar
O caminho recomendado é o servidor hospedado (https://mcp.tiflux.com): sempre atualizado, sem instalação e com autenticação segura via OAuth 2.0 ou chave de API.
Claude (claude.ai — web)
Acesse claude.ai → Configurações → Conectores
Clique em Adicionar conector personalizado
Cole a URL do servidor:
https://mcp.tiflux.com⚠️ Sem
/mcpno final — o conector usa a URL raiz.Clique em Conectar — a página de autorização do Tiflux abre automaticamente
Cole sua chave de API e clique em Autorizar
Pronto: por trás, a plataforma recebe um token OAuth 2.0 e o usa em todas as requisições seguintes — você não precisa manusear a chave novamente.
ChatGPT (web)
Acesse Configurações → Conectores (ou, ao criar um GPT, Adicionar um conector)
Adicione um conector personalizado apontando para:
https://mcp.tiflux.comConclua a autorização colando sua chave de API na página do Tiflux
A disponibilidade de conectores MCP no ChatGPT depende do plano e do modo da sua conta.
Claude Desktop
Mesmo fluxo do claude.ai: Configurações → Conectores → Adicionar conector personalizado → colar https://mcp.tiflux.com → Conectar → autorizar com a chave de API. Veja o passo a passo em Claude (claude.ai — web).
Claude Code
Adicione o servidor remoto com um único comando:
claude mcp add tiflux --transport http https://mcp.tiflux.com/mcp --header "x-tiflux-api-key:SUA_CHAVE" -s projectOu configure manualmente em .claude/settings.json ou ~/.claude.json:
{
"mcpServers": {
"tiflux": {
"type": "url",
"url": "https://mcp.tiflux.com/mcp",
"headers": {
"x-tiflux-api-key": "SUA_CHAVE"
}
}
}
}⚠️ Aqui a URL tem
/mcpno final (https://mcp.tiflux.com/mcp) — diferente do conector web, que usa a URL raiz.
Alternativa para cenários específicos: execução local via npx — veja Avançado: execução local (SDK via npx).
n8n
Use o node MCP Client Tool apontando para o servidor hospedado:
Adicione o node MCP Client Tool ao seu workflow
Endpoint:
https://mcp.tiflux.com/mcp(transporte HTTP Streamable)Autenticação: credencial do tipo Header Auth com nome
x-tiflux-api-keye valor igual à sua chave de API
Manus AI
Nas configurações do Manus, adicione um novo conector MCP — abre a tela Configuração do MCP
Preencha os campos:
Nome do servidor:
TifluxTipo de transporte:
HTTPURL do servidor:
https://mcp.tiflux.com
Em Cabeçalhos personalizados, clique em Adicionar cabeçalho personalizado e preencha:
Nome do cabeçalho:
x-tiflux-api-keyValor do cabeçalho: sua chave de API
Clique em Salvar — use Experimente para testar a conexão
Outros clientes MCP
Qualquer cliente MCP funciona com o servidor hospedado:
Cliente com transporte HTTP + headers: URL
https://mcp.tiflux.com/mcp+ headerx-tiflux-api-key: SUA_CHAVECliente com suporte a OAuth 2.0 (conectores): URL raiz
https://mcp.tiflux.com
Endpoints:
Endpoint | Método | Auth | Descrição |
| GET | Não | Informações do servidor |
| POST | Sim | Operações MCP |
| GET | Não | Health check |
Métodos de autenticação:
Método | Header | Quando usar |
Chave de API (direta) |
| Claude Code, n8n, Manus AI, scripts, SDK local |
Bearer token (OAuth) |
| Claude.ai, ChatGPT, conectores web |
Funcionalidades
Tickets: criar, consultar, atualizar, fechar, cancelar, reabrir e listar tickets com filtros avançados — incluindo transferência de mesa, histórico de estágios e SLA; relatório de avaliações de atendimento (CSAT) com comparação de período (
get_tickets_feedback_report)Comunicações internas e respostas: criar, listar, editar e excluir comunicações internas e respostas de tickets, com anexos (até 10 arquivos de 25MB cada)
Apontamentos de horas: criar e listar apontamentos de trabalho em tickets; listagem global por período com filtros server-side (
list_appointments_global); relatório agregado de apoio N2 por técnico e mesa com totalizadores (list_appointments_report); pré-apontamentos (cronômetros em andamento) vialist_pre_appointmentsChats (WhatsApp): listar caixa de entrada/meus/em atendimento/arquivados, ler o conteúdo/mensagens de um chat (
list_chat_messages), transferir e vincular chats, enviar mensagens e finalizar atendimentos; relatório de avaliações de atendimento (CSAT) com comparação de período (get_chats_feedback_report)Clientes: CRUD completo — dados cadastrais, mesas e grupos técnicos vinculados, usuários do portal e permissões de e-mail
Usuários/Agentes (admin): criar, consultar e atualizar agentes/atendentes — incluindo licenças, grupo técnico por nome e ativar/inativar (requer chave de administrador)
Solicitantes: buscar, criar, atualizar e gerenciar solicitantes, com resolução automática de nome/e-mail ao abrir tickets
Mesas e catálogo: explorar mesas, estágios, prioridades e itens de catálogo sem sair do chat
Campos personalizados: descobrir entidades, campos e opções para preencher campos customizados corretamente
Base de conhecimento: listar e criar artigos, com busca por título/tags e filtro por pasta
Contratos: listar contratos da organização (somente leitura) com filtros por cliente, tipo e status
Recursos (Equipamentos): listar, criar e atualizar equipamentos/ativos de clientes; exibir detalhes completos de hardware e inventário de um recurso individual (processador, memória, discos, rede, SO, fabricante, campos personalizados) via
get_equipment; consultar softwares instalados (inventário via agente); explorar grupos e tipos de recursos para montar fluxos de inventário de TI via IAPré-Tickets: listar e criar pré-tickets (solicitações em estágio pré-triagem, ainda não convertidas em tickets), com suporte a anexos (até 10 arquivos de 25MB cada)
Templates de Mensagem: listar templates HSM aprovados para WhatsApp via Gupshup (
list_gupshup_templates) e WhatsApp Cloud/Meta (list_whatsapp_cloud_templates), para alimentar o fluxo desend_messagecomtemplate_idFaturamentos: consultar o histórico de faturamentos da organização com filtros por período de emissão, vencimento, cliente (por ID ou nome), NFe, ticket e situação (
get_billings_history); exige permissão "Faturar serviços avulsos e contratos" e licença TicketsCatálogo de serviços (CRUD): criar, listar, atualizar e remover catálogos, áreas e itens de catálogo nos três níveis da hierarquia (catálogo → área → item); remoção em cascata com contagem pre-flight informativa (não é gate: não há confirmação nem dry-run); resolução automática de nome em todos os níveis (
services_catalog_name,area_name); requer roleservice_catalogs_manage
O catálogo completo, com parâmetros e exemplos de cada ferramenta, está em Available Tools (em inglês).
Configuração avançada
Verbosidade das respostas
O servidor suporta dois modos de verbosidade para controlar o consumo de tokens:
Modo | Descrição |
| Saída completa em Markdown com emojis, rodapés e blocos de paginação detalhados (padrão) |
| Saída enxuta — sem rodapé decorativo, resumo de paginação em uma linha; |
SDK (stdio) — variável de ambiente:
TIFLUX_MCP_VERBOSITY=compact npx @tiflux/mcp@latestServer (HTTP/Lambda) — header por requisição:
x-tiflux-verbosity: compactO padrão é
richnos dois modos. Integrações existentes não são afetadas a menos que a variável de ambiente ou o header seja definido.
Dicas para reduzir consumo de tokens
Ao construir aplicações que chamam este servidor MCP programaticamente, o custo de tokens importa. Siga estas orientações:
Passe IDs quando já os tiver. Toda ferramenta que aceita um parâmetro
_namepara auto-resolução (ex.:desk_name,stage_name,entity_field_name) fará uma ou mais chamadas extras à API para resolver o nome. Se você guardou o ID de uma chamada anterior, passe-o diretamente (ex.:desk_id,stage_id,entity_field_id) — é sempre mais rápido e barato.Use verbosidade
compactviaTIFLUX_MCP_VERBOSITY=compact(SDK) ou headerx-tiflux-verbosity: compact(Server). O modo compact corta a saída deget_ticketelist_ticketsem ~50%.Pagine deliberadamente.
list_ticketscom um intervalo de datas amplo em uma mesa movimentada pode retornar centenas de itens. Passelimiteoffsetintencionalmente — quando uma página cheia retorna, o modo compact acrescenta uma dica de próxima página (→ offset: N) para o modelo saber que pode haver mais a buscar.Para análise comparativa, use
get_tickets_comparison. Em vez de chamarlist_ticketspaginada duas vezes para dois períodos (o que pode ultrapassar 100k tokens e o teto de 6 iterações do orquestrador), useget_tickets_comparison: uma chamada MCP, 2 requests à API, resposta de centenas de tokens com totais, Δ e buckets pareados prontos para gráfico.
Available Tools
get_ticket
Retrieve a specific ticket by ID with comprehensive information including hierarchy (parent ticket and child tickets/sub-tasks), requestor, checklists summary, status, priority, desk, stage, catalog, responsible, client, audit data, SLA and URLs.
Parameters:
ticket_number(string, required): Number of the ticket to retrieveshow_entities(boolean, optional): Include ALL custom fields linked to the ticketinclude_filled_entity(boolean, optional): Include only custom fields with filled values
Returns: Comprehensive ticket information including:
Hierarchy: parent ticket (
#N — title) and child tickets (count +#N — titlelist) — shown only when a link existsRequestor: who opened the ticket (name, email, phone, extension) — distinct from the responsible (assignee)
Checklists summary: total, pending, required pending, with explicit ⚠️ warning when
blocks_closeis true or required checklists are missing (lists them by name)Status (ID, name, open/close/canceled default flags)
Priority (ID, name, SLA window
start_time → end_time, order)Desk (ID, internal name, display name, active status, appointment type)
Stage (ID, name, first/last stage flags, max time)
Service Catalog (item ID, item name, area, catalog)
Responsible (ID, name, email, type, technical group)
Client (ID, name, social reason, CPF/CNPJ
social_revenuewhen set, active status)Audit (created by ID, origin, created/updated dates)
SLA (status, expirations, deadlines,
attend_sla_solution,desactivate_sla_reasonwhen set)Equipment linked to the ticket (when
equipment.idis not null)Feedback/rating (when available) — rating and comment from the client's evaluation
Additional info: followers, worked hours, total resolution time (
closed_ticket_total_spent_solving), last answer type, reopens, URLsCustom fields: when present, includes field type, current value,
requiredflag (shown as(obrigatório)suffix), and options already set forsingle_select/checkboxfields (with IDs forlist_entity_field_options)
Verbosity (compact mode):
Hierarchy: single line
Pai: #N | Filhos: #A, #B(numbers only, no titles)Requestor:
Solicitante: <name> <email>Checklists: shown only when
blocks_closeorrequired_pending > 0Equipment, feedback, resolution time, SLA sub-fields, and low-value flags are omitted in compact
New in v2.43.0: Hierarchy (parent/child tickets), requestor, checklists summary, equipment, SLA sub-fields, priority/desk/client sub-fields, and cleanup of phantom fields (tags, closed_at).
create_ticket
Create a new ticket in Tiflux.
Parameters:
title(string, required): Ticket titledescription(string, required): Ticket description. Accepts Markdown (bold, lists, headings, code) — the MCP automatically converts it to HTML before sending to the API.client_id(number, optional): Client (company) IDclient_name(string, optional): Client (company) name for automatic search (alternative to client_id). Use only when the user says "client" or "company" explicitly.desk_id(number, optional): Desk IDdesk_name(string, optional): Desk/team name for automatic search (alternative to desk_id). Accepts partial names — e.g."cansados"resolves to"Dev - Cansados"(see Smart Name Resolution). Prefer this when the user references a name without qualifying the entity.priority_id(number, optional): Priority IDservices_catalogs_item_id(number, optional): Service catalog item IDcatalog_item_name(string, optional): Catalog item name for automatic search (alternative to services_catalogs_item_id, requires desk_id or desk_name)status_id(number, optional): Status IDrequestor_id(number, optional): Requestor ID (person who opens the ticket, must belong to the selected client). This is the canonical link — prefer it when you know the ID. Highest precedence: if provided, it is used directly with no resolution.requestor_name(string, optional): Requestor name. Used only when neitherrequestor_idnorrequestor_emailis provided. The MCP attempts to resolve it to an existingrequestor_id(avoids creating a "ghost" requestor) viaGET /requestors, falling back to the client-scopedGET /clients/{id}/requestorson 403. Multiple matches → returns a list to disambiguate; no match → sends the name as-is (the API resolves/creates the requestor).requestor_email(string, optional): Requestor email. The MCP automatically attempts to resolve it to an existingrequestor_idby searching the client's requestors (the canonical link). One match → uses therequestor_idand drops the raw email; zero matches → keeps the raw email as a fallback; multiple matches → returns a list to disambiguate. Has precedence overrequestor_name.requestor_telephone(string, optional): Requestor phone
Requestor precedence (v2.18.0): the canonical link is
requestor_id. The MCP resolves email and name torequestor_idautomatically when a matching registration exists, in the orderrequestor_id>requestor_email>requestor_name. When email or name resolves to an ID, the individual fields (name/email/telephone) are dropped from the payload so the registered requestor is linked instead of a loose/ghost entry. A raw email is only sent when no registration matches.
responsible_id(number, optional): Responsible user IDresponsible_name(string, optional): Responsible user name for automatic search (alternative to responsible_id)followers(string, optional): Comma-separated follower emailsparent_ticket_number(number, optional): Parent ticket number — the created ticket will be linked as a child of this ticketfiles_base64(array, optional): Array of base64 encoded files[{content: "base64...", filename: "file.png"}](max 10 files, 25MB each)
New in v2.4.0: Support for base64 file upload via files_base64. The ticket is sent as multipart/form-data. Note for Server mode (Lambda): files_base64 payloads are subject to the 6MB API Gateway limit.
Breaking change (v2.8.0): O parametro
files(caminhos locais) foi removido. Use a nova toolupload_ticket_filespara enviar arquivos via base64, ou passe os arquivos diretamente viafiles_base64.
update_ticket
Update an existing ticket in Tiflux. Supports transferring a ticket to another desk — when desk_id/desk_name is provided without an explicit stage_id/stage_name, the MCP automatically resolves the first stage of the destination desk (the stage with first_stage: true, or the one with the lowest index as a fallback), preventing invalid-stage errors.
Parameters:
ticket_number(string, required): Number of the ticket to update (e.g. "123", "456")title(string, optional): New ticket titledescription(string, optional): New ticket description. Accepts Markdown (bold, lists, headings, code) — the MCP automatically converts it to HTML before sending to the API.client_id(number, optional): New client IDdesk_id(number, optional): New desk ID. Transfers the ticket to the specified desk. Stages and priorities are scoped per desk — if no stage is provided, the MCP auto-resolves the first stage of the destination desk.desk_name(string, optional): Desk name for automatic search (alternative to desk_id). Accepts partial names — e.g."cansados"resolves to"Dev - Cansados"(see Smart Name Resolution). Prefer this when the user references a name without qualifying the entity.stage_id(number, optional): Stage/phase ID. Always takes precedence over auto-resolution.stage_name(string, optional): Stage name for automatic search (alternative to stage_id, requires desk_id or desk_name). Always takes precedence over auto-resolution.priority_id(number, optional): Priority ID. Priorities are scoped per desk — uselist_desk_prioritiesto discover valid IDs for the destination desk. When transferring desks, provide this field (orpriority_name) to preserve the ticket's priority (priorities are not automatically preserved across desk transfers).priority_name(string, optional): Priority name for automatic search (requiresdesk_idordesk_nameto resolve). Because it requires a desk, the API treats it as a transfer — sopriority_nameonly works when transferring to another desk. To change priority on the ticket's current desk, usepriority_iddirectly (no desk).priority_change_reason(string, optional): Reason for the priority change (free text). Required when changing priority (priority_id) outside of a desk transfer — the API rejectspriority_idwithout it (42201). Not allowed during a desk transfer — the API rejects it (42202); in that case it is dropped automatically and a warning is shown.status_id(number, optional): Status ID. There is no status listing endpoint in the API v2 — provide the ID directly (nostatus_name).responsible_id(number, optional): Responsible user ID (use null to unassign)responsible_name(string, optional): Responsible user name for automatic search (alternative to responsible_id)requestor_id(number, optional): New requestor (ticket opener) ID. The requestor must belong to the same client linked to the ticket. When provided together withrequestor_name,requestor_idtakes precedence.requestor_name(string, optional): Requestor name for automatic resolution (alternative torequestor_id). The MCP triesGET /requestors(global) and falls back toGET /clients/{id}/requestorson 403. Single match → uses the ID; multiple matches → lists candidates to disambiguate; no match → error suggestingsearch_requestor. If both endpoints return 403, returns a clear message suggestingrequestor_iddirectly.followers(string, optional): Comma-separated follower emails. ⚠️ REPLACES the full followers list — to add without removing, fetch current followers viaget_ticketfirst and send the complete list (existing + new). Empty string""removes all followers.services_catalogs_item_id(number, optional): Catalog item ID for updating desk with specific itemcatalog_item_name(string, optional): Catalog item name for automatic search (alternative to services_catalogs_item_id, requires desk_id or desk_name)
Note: At least one optional field must be provided along with the ticket_number.
Desk Transfer Prerequisites:
Desk relationship — origin and destination desks must be linked in Tiflux settings. Without this the API rejects the transfer with a
42202error.Catalog item for destination desk — desks that require a service catalog reject the transfer without
services_catalogs_item_id/catalog_item_nameof the destination desk.Priority is not preserved — priority is scoped per desk and is lost on transfer (becomes
null). Providepriority_name/priority_idto preserve it. Status is automatically reallocated by the API.
Priority change rules (enforced by the API v2):
Same desk (no transfer): use
priority_iddirectly (nodesk_id/desk_name).priority_change_reasonis required (42201otherwise).priority_namedoes not work here — it requires a desk, which the API interprets as a transfer.During a desk transfer: provide
priority_idorpriority_nameto preserve priority; do not sendpriority_change_reason(42202otherwise — it is dropped automatically with a warning).
Error messages: Common 42202 transfer errors (missing desk relationship, required catalog) are returned as actionable messages instead of raw API text.
update_ticket_entities
Update custom fields (entities) of a ticket in Tiflux. Supports up to 50 fields per request. For checkbox fields with multiple named options, send one item per option with entity_field_option_id. Use list_entity_field_options to discover option IDs.
Tip: Prefer
entity_field_id(numeric) when available — it avoids extra API calls. Use the_nameparams only when you don't have the ID yet.
Parameters:
ticket_number(string, required): Ticket number to updateentities(array, required): List of custom fields to update. For multiple-choice checkbox fields, send one item per option.
Entity Object Structure:
entity_field_id(number): Custom field ID (obtained viaget_ticketorlist_entity_fields). Prefer this when available.entity_name(string, optional): Entity group name for automaticentity_field_idresolution — alternative when the ID is unknown.entity_field_name(string, optional): Field name within the entity group for automaticentity_field_idresolution — use together withentity_name.entity_field_option_name(string, optional): Option name for automaticentity_field_option_idresolution (forsingle_select/checkboxfields).value(string, required): Field value. Accepted types:text: stringtext_area: stringcurrency: float as string (e.g., "150.55")phone: numbers only (e.g., "47999999999")email: stringlink: URL starting with http/https/ftpdate: format YYYY-MM-DDsingle_select: option ID as stringcheckbox: boolean as string"true"/"false"Use
nullto clear non-required fields
entity_field_option_id(number, optional): Option ID for checkbox multiple-choice fields. Uselist_entity_field_optionsto get IDs. For multiple-choice checkboxes, send one item per option with the sameentity_field_idand differententity_field_option_id.country_code(string, optional): Country code (for phone fields outside Brazil)
Example — simple text/date fields (with IDs, most efficient):
{
"ticket_number": "123",
"entities": [
{ "entity_field_id": 72, "value": "New value" },
{ "entity_field_id": 73, "value": "2025-01-15" }
]
}Example — resolving by name (when IDs are unknown):
{
"ticket_number": "123",
"entities": [
{
"entity_name": "Contrato",
"entity_field_name": "Tipo de contrato",
"entity_field_option_name": "Suporte Premium",
"value": "true"
}
]
}Example — checkbox with multiple named options:
{
"ticket_number": "12345",
"entities": [
{ "entity_field_id": 81, "entity_field_option_id": 11, "value": "true" },
{ "entity_field_id": 81, "entity_field_option_id": 12, "value": "false" },
{ "entity_field_id": 81, "entity_field_option_id": 13, "value": "true" }
]
}cancel_ticket
Cancel a specific ticket in Tiflux.
Parameters:
ticket_number(string, required): Ticket number to be cancelled (e.g., "37", "123")
Example:
{
"ticket_number": "84429"
}list_tickets
List tickets with filtering options. Catalog and priority are automatically shown in every ticket card — no extra API calls needed (already included in GET /tickets response).
Parameters:
desk_ids(string, optional): Comma-separated desk IDs (e.g., "1,2,3")desk_name(string, optional): Desk/team name for automatic ID resolution. Accepts partial names — e.g."cansados"resolves to"Dev - Cansados"(see Smart Name Resolution). Prefer this field when the user references a name without qualifying the entity.client_ids(string, optional): Comma-separated client (company) IDs (e.g., "1,2,3")client_name(string, optional): Client (company) name for automatic search. Use only when the user explicitly says "client", "company", or gives a known corporate name. For a person, preferrequestor_email.stage_ids(string, optional): Comma-separated stage IDs (e.g., "1,2,3")stage_name(string, optional): Stage name — use withdesk_nameordesk_ids(either works)responsible_ids(string, optional): Comma-separated responsible (assigned attendant) user IDs (use when you already have the ID)responsible_name(string, optional): Responsible user name for automatic resolution. Works for both admin (viaGET /users) and non-admin users (via attendant groups fallback). Use when the user says "assigned to" / "responsible" and gives a name.requestor_ids(string, optional): Comma-separated requestor (person who opened the ticket) IDs (e.g., "1,2,3"). Use for filtering by person (not company). Resolve the ID viasearch_requestor.requestor_email(string, optional): Email of the requestor (person who opened the ticket). Use when the user references a person or provides an email directly. Avoids a round-trip to resolve the ID.services_catalogs_item_ids(string, optional): Comma-separated service catalog item IDs (e.g., "11,12,13"). Passthrough directly to the API — max 15 IDs (theGET /ticketslimit; beyond that only the first 15 are applied, with a warning). Duplicates are removed. Use when you already know the IDs (viasearch_catalog_item). For name/area/catalog text search, usecatalog_query.catalog_query(string, optional): Free-text search term to filter by service catalog. Matches partially against catalog name, area name, and item name server-side — a single term like"security"returns items from all areas/catalogs whose name contains that term. Requires a desk (desk_idordesk_name). For precise IDs, useservices_catalogs_item_ids.priority_ids(string, optional): Comma-separated priority IDs (e.g., "17,18"). Passthrough directly to the API — max 15 IDs (theGET /ticketslimit; duplicates removed). Use when you already know the IDs (vialist_desk_priorities). For name-based search, usepriority_name.priority_name(string, optional): Priority name for automatic fuzzy resolution (e.g., "high", "baixa"). Requires a desk (desk_idordesk_name). For direct IDs, usepriority_ids.offset(number, optional): Page number (default: 1)limit(number, optional): Items per page (default: 20, max: 200)is_closed(boolean, optional): Legacy status flag. Preferfilter_byfor more granular control.is_closed: true= only closed;is_closed: false= only open.filter_by(string, optional): Status filter with precedence overis_closed: "open" (open tickets only), "closed" (resolved/closed, excludes cancelled), "canceled" (cancelled only — robust with custom status names), or "all" (all statuses). Underdate_type="solved_in_time", "all" returns closed + cancelled together. If omitted withdate_type="solved_in_time", the MCP assumes"closed"and announces this in the response — use"all"to include cancelled too.date_type(string, optional): Date axis for filtering: "created_at" (creation date, default) or "solved_in_time" (closing/resolution date). Accepts timezone offsets beyond Z (e.g.,-03:00).date_type="solved_in_time"+filter_by="open"is contradictory — the MCP returns an error immediately, without calling the API.group_by(string, optional): Aggregates the ticket COUNT instead of returning the list. "day"/"week"/"month" group by period (combine withdate_type+ date range); "desk" groups by desk. Returns{ group_by, date_type, total, buckets: [{period, count}] }. Use for comparison/trend (e.g., "opened per day this week") or per-desk breakdowns. Whenstart_datetime/end_datetimeare provided and at least 1 bucket is returned, missing periods in the window are zero-filled (e.g., "2026-02" between "2026-01" and "2026-03" appears with count 0).sla_expiring_before(string, optional): Filters OPEN (and non-stopped) tickets whose RESOLUTION SLA (solve_expiration) is due before the given ISO 8601 datetime, including already overdue. Use for "SLA at risk" (e.g., pass end-of-today). Combine withgroup_by=deskfor "desks with SLA at risk".start_datetime(string, optional): Start date/time filter in ISO 8601 format (e.g., "2024-05-15T00:00:00Z"). Filters tickets with date >= start_datetimeend_datetime(string, optional): End date/time filter in ISO 8601 format (e.g., "2024-05-15T23:59:59Z"). Filters tickets with date <= end_datetimecreated_by_way_of(string, optional): Filter tickets by creation origin. Accepted values:"web"(Tiflux Web),"agent"(Agente),"chat_widget"(Chat Widget),"whatsapp"(WhatsApp),"email"(E-mail),"external_form"(Formulario Externo),"mobile"(Mobile),"api"(API),"chat"(Chat),"recurrent_activity"(Atividade Recorrente),"trigger"(Gatilho),"ticket_group"(Grupo de Tickets),"ai_agent"(Agente de IA). Invalid values are rejected locally without calling the API.
Note: At least one filter is required (desk, client, requestor, responsible, stage, date range, SLA, catalog, priority, or created_by_way_of).
Guard-rails for date_type="solved_in_time":
If
filter_byis not provided, the MCP assumesfilter_by="closed"and announces it in the response (e.g., "Status: Fechados — assumido; use 'all' para incluir cancelados"). Usefilter_by="all"to include cancelled tickets too.If
filter_by="open"is explicitly passed withsolved_in_time, the MCP returns an error immediately — this is a contradictory combination (a ticket can't be both "resolved" and "open").
Common recipes:
User question | Recommended call |
"closed per month in desk X" |
|
"opened today in desk X" |
|
"cancelled in the period" |
|
"this semester vs last" |
|
Zero-result diagnostics: When the response is empty (no tickets), the MCP automatically runs up to 2 sonda API calls to tell the AI why — whether it's the status filter, the date range, or a genuine zero for this scope.
Volume guard: When the total (X-Total-Items) exceeds 500 tickets in a regular listing (without group_by), the response appends an instruction not to paginate for analysis — use group_by or get_tickets_comparison instead. This threshold is set at 500 in LIST_TOTAL_WARN_THRESHOLD.
Catalog filter note: catalog_query uses server-side partial matching against catalog, area, and item names simultaneously — one term matches items from multiple areas. The MCP paginates all results and resolves to item IDs before calling GET /tickets. Because GET /tickets accepts at most 15 services_catalogs_item_ids (Swagger error 42201 otherwise), if the query resolves to more than 15 items only the first 15 are applied and a warning is returned (the result may be incomplete). For surgical precision, discover IDs via search_catalog_item and pass a narrow set via services_catalogs_item_ids.
Example — filter by catalog query:
{
"desk_name": "Support",
"catalog_query": "security"
}Example — filter by priority and catalog (IDs):
{
"desk_ids": "1",
"priority_ids": "17",
"services_catalogs_item_ids": "11,12"
}Example — filter by requestor email:
{
"requestor_email": "joao@empresa.com",
"is_closed": false
}Date Filtering Examples:
// List tickets created in a specific date range (including closed ones)
{
"desk_name": "Support",
"date_type": "created_at",
"start_datetime": "2024-01-01T00:00:00Z",
"end_datetime": "2024-01-31T23:59:59Z",
"is_closed": true
}
// List tickets resolved in a specific period
// (filter_by="closed" assumed automatically; use "all" to include cancelled)
{
"desk_name": "Support",
"date_type": "solved_in_time",
"start_datetime": "2024-01-01T00:00:00Z",
"end_datetime": "2024-01-31T23:59:59Z"
}get_tickets_comparison
Compare ticket COUNTS between two time periods in a single call. Returns totals, absolute delta (Δ), and percentage change (Δ%) for each bucket (day/week/month/desk).
When to use vs list_tickets:
To COUNT/COMPARE/TREND → use
get_tickets_comparison. One MCP call, 2 API requests, answer in hundreds of tokens.To VIEW individual items → use
list_ticketswithoutgroup_by.
Default comparison period: If compare_start_datetime/compare_end_datetime are not provided, the comparison period is the immediately preceding period of the same duration (compare_end = start_datetime − 1s; same duration in ms). Provide only start_datetime and end_datetime and the comparison window is calculated automatically.
Default filter_by by date_type:
created_at(default):filter_by="all"— historical comparisons count all statuses (open, closed, cancelled).solved_in_time:filter_by="closed"— comparisons by closing date assume resolved tickets; usefilter_by="all"to include cancelled too (e.g., 358 closed + 31 cancelled = 389). This aligns withlist_ticketsso both tools return the same number for the same query.
Parameters:
start_datetime(string, required): Start of the main period (ISO 8601, e.g., "2026-01-01T00:00:00Z" or "2026-01-01T00:00:00-03:00")end_datetime(string, required): End of the main period (ISO 8601, e.g., "2026-06-30T23:59:59Z")compare_start_datetime(string, optional): Start of comparison period (ISO 8601). Must be provided withcompare_end_datetime(complete pair). If omitted, the immediately preceding period of the same duration is used automatically.compare_end_datetime(string, optional): End of comparison period (ISO 8601). Pair withcompare_start_datetime.group_by(string, optional): Granularity — "day", "week", "month" (temporal buckets) or "desk" (per-desk breakdown, useful for "which desk grew"). Default: "month".date_type(string, optional): Time axis applied to both periods — "created_at" (creation date, default) or "solved_in_time" (closing/resolution date). Consistent across both calls automatically. Accepts timezone offsets beyond Z (e.g.,-03:00).filter_by(string, optional): Status filter — "open", "closed", "canceled", or "all". Default depends ondate_type: "all" forcreated_at; "closed" forsolved_in_time. Use "all" withsolved_in_timeto include cancelled tickets in the count.desk_ids(string, optional): Comma-separated desk IDs (max 15). Alternative todesk_name.desk_name(string, optional): Desk/team name for automatic ID resolution. Accepts partial names.client_ids(string, optional): Comma-separated client (company) IDs (max 15).client_name(string, optional): Client (company) name for automatic resolution.responsible_ids(string, optional): Comma-separated responsible user IDs (max 15). Passthrough.requestor_email(string, optional): Requestor email filter. Passthrough.priority_ids(string, optional): Comma-separated priority IDs (max 15). Passthrough.services_catalogs_item_ids(string, optional): Comma-separated catalog item IDs (max 15). Passthrough.
Example — compare last 6 months vs the 6 before (automatic adjacent period):
{
"start_datetime": "2026-01-01T00:00:00Z",
"end_datetime": "2026-06-30T23:59:59Z",
"group_by": "month"
}Example — compare two explicit periods for a specific desk:
{
"start_datetime": "2026-01-01T00:00:00Z",
"end_datetime": "2026-06-30T23:59:59Z",
"compare_start_datetime": "2025-07-01T00:00:00Z",
"compare_end_datetime": "2025-12-31T23:59:59Z",
"group_by": "month",
"desk_name": "Support"
}Example — which desk grew the most (group_by=desk):
{
"start_datetime": "2026-01-01T00:00:00Z",
"end_datetime": "2026-06-30T23:59:59Z",
"group_by": "desk",
"filter_by": "all"
}Rich response example:
**📊 Comparação de tickets por mês** — por data de criação
| | Período atual | Período anterior | Δ |
|---|---|---|---|
| **Total** | **15** | **12** | **+3 (+25%)** |
| Período | Atual | Anterior | Δ | Δ% |
|---|---|---|---|---|
| 2026-01 | 10 | 8 | +2 | +25% |
| 2026-02 | 5 | 4 | +1 | +25% |
*✅ Dados obtidos da API TiFlux em tempo real*Compact response example:
Comparação por mês — por data de criação: atual 15 vs anterior 12 → Δ +3 (+25%)
Buckets (atual/anterior): 2026-01:10/8 · 2026-02:5/4get_tickets_feedback_report
Relatório de avaliações de atendimento (CSAT) de tickets com comparação automática de período. Retorna métricas de satisfação (média, avaliados, finalizados, taxa de resposta) com deltas entre dois períodos, e opcionalmente a lista de tickets avaliados com comentários.
When to use vs other tools:
CSAT / satisfaction ratings for TICKETS →
get_tickets_feedback_report(this tool)CSAT / satisfaction ratings for CHATS →
get_chats_feedback_reportTicket count / trend comparison →
get_tickets_comparison
Default comparison period: if compare_start_date/compare_end_date are not provided, the comparison period is the immediately preceding period of the same duration. Provide only start_date and end_date and the comparison window is calculated automatically.
No filter by rating in the API — to filter by rating, use include_list=true and filter the returned list by rating client-side.
Enrichment workflow:
Run with
include_list=trueto get the list of evaluated tickets (withrating,revised_in_time, client, responsible, desk, andcomments).For full ticket details (history, SLA, replies) → use
get_ticketorlist_ticket_answerswith the ticket ID.The
commentsfield (evaluation comment) is already in the list — no further enrichment needed for comments.
Note: The comments field is plural and may be an empty string "" when the client did not leave a comment.
Note: This report requires administrator/reports permission — non-admin API keys receive 403.
Parameters:
start_date(string, required): Start of the main period (YYYY-MM-DD, e.g., "2026-07-01")end_date(string, required): End of the main period (YYYY-MM-DD, e.g., "2026-07-31")compare_start_date(string, optional): Start of comparison period (YYYY-MM-DD). Must be provided withcompare_end_date. If omitted, the immediately preceding period of the same duration is used.compare_end_date(string, optional): End of comparison period (YYYY-MM-DD). Pair withcompare_start_date.include_list(boolean, optional): If true, includes the paginated list of evaluated tickets in the main period. Default: false.offset(integer, optional): Page number for the list (default: 1). Only relevant withinclude_list=true.limit(integer, optional): Items per page (default: 20, max: 200). Only relevant withinclude_list=true.responsible_ids(string, optional): Comma-separated responsible user IDs (max 15). Applied to both calls (main + comparison).department_ids(string, optional): Comma-separated department IDs (max 15). Applied to both calls.technical_group_ids(string, optional): Comma-separated technical group IDs (max 15). Applied to both calls.
Example — compare this month vs last month:
{
"start_date": "2026-07-01",
"end_date": "2026-07-31"
}Example — get list of evaluated tickets with comments:
{
"start_date": "2026-07-01",
"end_date": "2026-07-31",
"include_list": true,
"limit": 50
}Rich response example:
**📊 Relatório de avaliações de atendimento — Tickets**
**Período principal:** 2026-07-01 a 2026-07-31
**Período de comparação:** 2026-05-31 a 2026-06-30
| Métrica | Período atual | Período anterior | Δ |
|---------|--------------|-----------------|---|
| Média de avaliação | **4.5** | 4.0 | +0.5 (+12.5%) |
| Tickets avaliados | **20** | 15 | +5 (+33.3%) |
| Tickets finalizados | **100** | 80 | +20 (+25%) |
| Clientes avaliadores | **15** | 12 | +3 (+25%) |
| Taxa de resposta (%) | **80.0** | 75.0 | +5 (+6.7%) |
*✅ Dados obtidos da API TiFlux em tempo real*close_ticket
Close a specific ticket in Tiflux.
Parameters:
ticket_number(string, required): Ticket number to be closed (e.g., "37", "123")
Example:
{
"ticket_number": "84429"
}Success Response:
**Ticket #84429 fechado com sucesso!**
**Mensagem:** Ticket 84429 closed successfully
*Ticket fechado via API Tiflux*create_ticket_answer
Create a new answer (client communication) in a specific ticket.
Parameters:
ticket_number(string, required): Ticket number where answer will be createdtext(string, required): Answer content that will be sent to the client. Accepts Markdown (bold, lists, headings, code) — the MCP automatically converts it to HTML before sending to the API.with_signature(boolean, optional): Include user signature in the answer (default: false)files_base64(array, optional): Array of base64 encoded files[{content: "base64...", filename: "file.pdf"}](max 10 files, 40MB each)
New in v1.3.0: Support for base64 file upload via files_base64 parameter.
Breaking change (v2.8.0): O parametro
files(caminhos locais) foi removido. Use a nova toolupload_ticket_filespara enviar arquivos via base64, ou passe os arquivos diretamente viafiles_base64.
Example:
{
"ticket_number": "123",
"text": "Hello, your issue has been resolved.",
"with_signature": true,
"files_base64": [{"content": "JVBERi0x...", "filename": "attachment.pdf"}]
}search_client
Search for clients by name (shortcut — name-only). Use list_clients for full filters and pagination.
Parameters:
client_name(string, required): Client name to search (partial match supported)
list_clients
List clients with filters and pagination. Full version of search_client — accepts status, name, and CPF/CNPJ filters.
Parameters:
active(boolean, optional): Filter by status: true = active only, false = inactive only. Omit for all.name(string, optional): Filter by name (partial match)social_revenue(string, optional): Filter by CPF/CNPJoffset(number, optional): Page number (default: 1)limit(number, optional): Results per page (default: 20, max: 200)
Example:
{
"active": true,
"name": "Acme",
"limit": 10
}get_client
Get full details of a client by ID.
Parameters:
client_id(number, required): Client ID (obtained viasearch_clientorlist_clients)show_entities(boolean, optional): Include custom fields (entities) in the response (default: false)
Example:
{
"client_id": 42,
"show_entities": true
}create_client
Create a new client in Tiflux. Only name and social are required; all other fields are optional and only sent if provided.
Parameters:
name(string, required): Client trade name (nome fantasia)social(string, required): Client legal name (razão social)social_revenue(string, optional): CPF or CNPJdesk_ids(array of numbers, optional): Desk IDs to associateadd_all_desks(boolean, optional): Associate all deskstechnical_group_ids(array of numbers, optional): Technical group IDs to associatestatus(boolean, optional): Active (true) or inactive (false) — default: truemax_agents(number, optional): Maximum agents allowedemail_financial(string, optional): Financial contact emailanotations(string, optional): Internal notesbilling_report_type(string, optional):detailed_with_appointment,detailed,synthetic, or""(empty)
Example:
{
"name": "Acme Corp",
"social": "Acme Corporação Ltda",
"social_revenue": "12.345.678/0001-99",
"desk_ids": [1, 2]
}update_client
Update an existing client (partial update — only provided fields are sent).
Parameters:
client_id(number, required): Client ID to updateAll fields from
create_client(all optional)
Example:
{
"client_id": 42,
"status": false,
"email_financial": "novo@empresa.com"
}update_client_entities
Update custom fields (entities) for a client. Supports up to 50 fields per request. For checkbox fields with multiple options, send one item per option with entity_field_id + entity_field_option_id + value: "true"/"false".
Tip: Prefer
entity_field_id(numeric) when available — it avoids extra API calls. Use the_nameparams only when you don't have the ID yet.
Parameters:
client_id(number, required): Client ID to updateentities(array, required): List of custom fields. Each item:entity_field_id(number): Custom field ID. Prefer this when available.entity_name(string, optional): Entity group name for automaticentity_field_idresolution.entity_field_name(string, optional): Field name for automaticentity_field_idresolution (use withentity_name).entity_field_option_name(string, optional): Option name for automaticentity_field_option_idresolution.value(string, required): Field value (or null to clear)entity_field_option_id(number, optional): Option ID for checkbox/single_selectcountry_code(string, optional): Country code for phone fields
Example — with IDs (most efficient):
{
"client_id": 42,
"entities": [
{ "entity_field_id": 72, "value": "TI" },
{ "entity_field_id": 80, "entity_field_option_id": 12, "value": "true" }
]
}Example — resolving by name:
{
"client_id": 42,
"entities": [
{
"entity_name": "Dados comerciais",
"entity_field_name": "Segmento",
"entity_field_option_name": "Tecnologia",
"value": "true"
}
]
}get_client_desks
List desks associated with a client.
Parameters:
client_id(number, required): Client IDoffset(number, optional): Page number (default: 1)limit(number, optional): Results per page (default: 20, max: 200)
get_client_technical_groups
List technical groups associated with a client.
Parameters:
client_id(number, required): Client IDoffset(number, optional): Page number (default: 1)limit(number, optional): Results per page (default: 20, max: 200)
create_client_user
Create a portal user for a client. Allows the user to access the client portal.
Parameters:
client_id(number, required): Client ID to associate the user withname(string, required): Full name of the useremail(string, required): User email — used for portal loginextension(string, optional): Phone extensionauthorization_flow(boolean, optional): Require authorization for portal accesstelephone(string, optional): Phone numbercountry_code(string, optional): Country code for the phone number
Example:
{
"client_id": 42,
"name": "João Silva",
"email": "joao@empresa.com",
"telephone": "11999999999"
}add_client_email_permission
Add an authorized domain or email to open tickets on behalf of a client.
Parameters:
client_id(number, required): Client IDaddress(string, required): Domain (e.g.@empresa.com.br) or specific email authorized to open tickets for this client
Example:
{
"client_id": 42,
"address": "@empresa.com.br"
}list_client_addresses
List the addresses registered for a client.
Parameters:
client_id(number, required): Client IDoffset(number, optional): Page number (default: 1)limit(number, optional): Results per page (default: 20, max: 200)
get_client_address
Get details of a specific address of a client.
Parameters:
client_id(number, required): Client IDid(number, required): Address ID
create_client_address
Create a new address for a client.
Parameters:
client_id(number, required): Client IDcep(string, required): ZIP code (e.g."89201-305")city(string, required): Cityneighborhood(string, required): Neighborhood/districtnumber(number, required): Street number (integer)state(string, required): State — 2-letter code (e.g."SC")street(string, required): Street namecomplement(string, optional): Address complement (e.g."Sala 3")
Example:
{
"client_id": 42,
"cep": "89201-305",
"city": "Joinville",
"neighborhood": "Centro",
"number": 100,
"state": "SC",
"street": "Rua das Flores",
"complement": "Sala 3"
}update_client_address
Partially update an address of a client. Only the provided fields are sent.
Parameters:
client_id(number, required): Client IDid(number, required): Address ID to updatecep(string, optional): ZIP codecity(string, optional): Cityneighborhood(string, optional): Neighborhoodnumber(number, optional): Street numberstate(string, optional): State codestreet(string, optional): Street namecomplement(string, optional): Complement
delete_client_address
Remove an address from a client.
Parameters:
client_id(number, required): Client IDid(number, required): Address ID to remove
list_client_contacts
List the contacts (phone/email) registered for a client.
Parameters:
client_id(number, required): Client IDoffset(number, optional): Page number (default: 1)limit(number, optional): Results per page (default: 20, max: 200)
get_client_contact
Get details of a specific contact of a client.
Parameters:
client_id(number, required): Client IDid(number, required): Contact ID
create_client_contact
Create a new contact (phone/email) for a client.
Parameters:
client_id(number, required): Client IDuse(string, required): Contact usage type (e.g."Personal","Commercial")number(string, required): Phone number (accepts BR and international formats)owner(string, required): Name of the contact owneremail(string, required): Contact emailcountry(string, optional): Country code (e.g."BR","US")
Example:
{
"client_id": 42,
"use": "Commercial",
"number": "47999990000",
"owner": "João Silva",
"email": "joao@empresa.com",
"country": "BR"
}update_client_contact
Partially update a contact of a client. Only the provided fields are sent.
Parameters:
client_id(number, required): Client IDid(number, required): Contact ID to updateuse(string, optional): Contact usage typenumber(string, optional): Phone numberowner(string, optional): Contact owner nameemail(string, optional): Contact emailcountry(string, optional): Country code
delete_client_contact
Remove a contact from a client.
Parameters:
client_id(number, required): Client IDid(number, required): Contact ID to remove
search_user
Search for users by name to use as responsible in tickets.
Parameters:
name(string, required): User name to search (partial match supported, searches in name and email)type(string, optional): User type filter (client, attendant, admin)active(boolean, optional): Filter active (true) or inactive (false) userslimit(number, optional): Results per page (default: 20, max: 200)offset(number, optional): Page number (default: 1)
Non-admin support (fallback via attendant groups):
If the API key belongs to a non-admin user, GET /users returns 403. In this case, the tool automatically falls back to enumerating attendant groups (GET /technical-groups) and their members (GET /technical-groups/{id}/users), then applies fuzzy matching by name. The result is identical to the admin path — no parameter change needed. A note is added to the output when the fallback was used.
Implementation Note:
For admin users, the Tiflux API does not support name-based filtering in the /users endpoint — the tool fetches up to 200 users and filters client-side. For non-admin users, the tool uses the technical-groups chain and deduplicates users that appear in multiple groups.
Example:
{
"name": "John",
"type": "attendant",
"active": true
}search_technical_user
Search for technical attendants (users who can be assigned as responsible) in Tiflux by name, email, desk, or client. Uses the GET /technical-users endpoint — does not require user management permission (works for both admin and non-admin attendants). Use the returned id as responsible_id when creating or updating a ticket.
Note on responsible_name auto-resolve: When responsible_name is passed to create_ticket, update_ticket, or list_tickets, the MCP now uses GET /technical-users as the primary resolution path (fast, 1 round-trip, works for all profiles). The old fallback via GET /technical-groups is only triggered if the primary path returns an unexpected error (404/403), preserving compatibility with orgs where the endpoint may not be available.
Parameters:
name(string, optional): Attendant name to search (partial match, case-insensitive, server-side)email(string, optional): Attendant email (partial match, case-insensitive, server-side)desk_id(number, optional): Filter attendants who serve this deskclient_id(number, optional): Filter attendants who serve this clientlimit(number, optional): Results per page (default: 20, max: 200)offset(number, optional): Page number (default: 1)
Example:
{
"name": "Ana",
"desk_id": 123
}Returns: List of attendants with id, name, and email. Use the id in responsible_id.
create_user
Create a new user/agent in Tiflux (requires administrator permission — returns 403 for non-admin keys). Required fields: name, email, and either technical_group_id or technical_group_name. License fields are optional and only sent if provided.
Admin-only: This tool uses
POST /users, which the API restricts to admin keys. Non-admin API keys will receive a clear error message indicating administrator permission is required.
Parameters:
name(string, required): User nameemail(string, required): User emailtechnical_group_id(number, optional): ID of the technical group to assign the user to (required iftechnical_group_namenot provided)technical_group_name(string, optional): Name of the technical group — fuzzy match; if ambiguous, lists available groups and asks for clarificationwhatsapp_license(boolean, optional): WhatsApp licensetickets_license(boolean, optional): Tickets licenseremote_access_license(boolean, optional): Remote access licenseapi_license(boolean, optional): API licensesplashtop_license(boolean, optional): Splashtop license
technical_group_name semantics: If the name resolves to exactly 1 group, it proceeds. If 0 or N groups match (or no name is provided), the tool lists all available groups (id — name) and asks you to specify — no silent failure.
Example:
{
"name": "Ana Silva",
"email": "ana.silva@empresa.com",
"technical_group_name": "Suporte",
"tickets_license": true
}Returns: Confirmation with the created user's ID and name. Use the ID as responsible_id in tickets.
get_user
Retrieve full details of a user/agent by ID (requires administrator permission).
Admin-only: This tool uses
GET /users/{id}, which the API restricts to admin keys.
Parameters:
id(number, required): User ID
Example:
{
"id": 42
}Returns: User details including: id, name, email, type (_type), active status, technical_group_id, telephone, extension, client_ids, last_login_at, Google Auth status (gauth_enabled), and signature.
update_user
Update an existing user/agent (partial update — requires administrator permission). The id field is required; at least one data field must be provided.
Admin-only: This tool uses
PUT /users/{id}, which the API restricts to admin keys.
Parameters:
id(number, required): User IDname(string, optional): New user nameemail(string, optional): New user emailtechnical_group_id(number, optional): New technical group IDtechnical_group_name(string, optional): New technical group name — fuzzy match (seecreate_usersemantics above)active(boolean, optional): Activate (true) or deactivate (false) the userextension(string, optional): User extensiontelephone(string, optional): User telephoneclient_ids(array of numbers, optional): Client IDs linked to this usercountry_code(string, optional): Country codewhatsapp_license(boolean, optional): WhatsApp licensetickets_license(boolean, optional): Tickets licenseremote_access_license(boolean, optional): Remote access licenseapi_license(boolean, optional): API licensesplashtop_license(boolean, optional): Splashtop license
Example:
{
"id": 42,
"active": false,
"technical_group_name": "Dev"
}Returns: Confirmation with user ID, updated name, and list of updated fields.
search_requestor
Search for requestors (ticket openers) in Tiflux by name, email, or telephone. Uses the dedicated GET /requestors endpoint with server-side filtering — no client-side limit.
Automatic fallback chain (triggers on 403 OR on zero results — no questions asked): the tool tries each source in order and returns the first that finds someone, so it also works for non-admin attendants and for searches where the term exists only as a user (not as a registered requestor):
GET /requestors— global requestors (admin/global permission). → use theidasrequestor_id.GET /clients/{client_id}/requestors— client-scoped requestors (only ifclient_idis provided; clients are already filtered by the attendant's permission). →requestor_id.GET /users— users matching the name/email. Users are not requestors, but their email can be used asrequestor_emailwhen creating the ticket.GET /users/me— the current user. Suggests opening the ticket as yourself, using your own email asrequestor_email.
A non-403 hard error (e.g. 5xx) on the primary endpoint is surfaced instead of being masked by the chain. The calling LLM decides the next step from the suggestion.
Parameters:
name(string, optional): Requestor name to search (partial match, server-side)email(string, optional): Requestor email to searchtelephone(string, optional): Requestor phone number (no country code, no symbols)can_open_ticket(boolean, optional): Filter requestors who can (true) or cannot (false) open tickets by emailclient_id(number, optional): Client ID to scope the search. Enables the automaticGET /clients/{id}/requestorsfallback when the global endpoint returns 403.limit(number, optional): Results per page (default: 20, max: 200)offset(number, optional): Page number (default: 1)
Note: At least one filter parameter must be provided.
Returns: When found via levels 1–2, a list of requestors with id, name, email, telephone, client.name, and can_open_ticket (use the id as requestor_id). When found only via level 3 (users) or level 4 (yourself), a suggestion to use the matched email as requestor_email.
Example:
{
"name": "João Silva"
}Example (by email):
{
"email": "joao@empresa.com"
}list_requestors
List the requestors of a specific client (canonical per-client listing — GET /clients/{id}/requestors, aligned with list_clients). Use search_requestor when you need a cross-client search with the fallback chain; use list_requestors for the requestor catalog of a known client.
Parameters:
client_id(number, required): Client whose requestors will be listedname(string, optional): Filter by name (partial match)email(string, optional): Filter by emailtelephone(string, optional): Filter by phone (digits only, no country code)extension(string, optional): Filter by extensioncan_open_ticket(boolean, optional): Filter requestors who can (true) or cannot (false) open tickets by emailinclude_entity_fields(boolean, optional): Include each requestor's custom fields in the response (default: false). When true, each field shows type,requiredflag, and — forsingle_select/checkboxtypes — the marked options with title and IDs forlist_entity_field_options.offset(number, optional): Page number (default: 1)limit(number, optional): Requestors per page (default: 20, max: 200)
Returns: A paginated list of requestors with id, name, email, telephone, extension, can_open_ticket, and (when include_entity_fields=true) custom field details including marked option titles and IDs.
Example:
{
"client_id": 123,
"include_entity_fields": true
}get_requestor
Get full details of a requestor of a client by ID (GET /clients/{id}/requestors/{requestor_id}). Returns registration data and optional custom fields (entities, applied_in: "solicitant").
Parameters:
client_id(number, required): Client the requestor belongs torequestor_id(number, required): Requestor ID (obtained vialist_requestorsorsearch_requestor)show_entities(boolean, optional): Include custom fields (entities) in the response (default: false). When true, each field shows type,requiredflag (suffix(obrigatório)),entity_field_id, and — forsingle_select/checkboxtypes — the marked options with IDs and a hint to calllist_entity_field_optionsfor all available options.
Example:
{
"client_id": 123,
"requestor_id": 555,
"show_entities": true
}create_requestor
Create a new requestor in a client (POST /clients/{id}/requestors). Required fields: client_id, name, email. Other fields are optional and only sent if provided.
Note:
telephoneis optional here. When it comes to ticket creation, field requirements may differ — they depend on the desk'srequired_fields(seeGET /desks/{id}), not on the requestor registration endpoint.
Parameters:
client_id(number, required): Client to link the requestor toname(string, required): Requestor nameemail(string, required): Requestor emailtelephone(string, optional): Requestor phone. If provided, must be a valid number — do not send an empty string (causes 422)can_open_ticket(boolean, optional): Whether the requestor can open tickets by emailextension(string, optional): Requestor extensioncountry(string, optional): Requestor country
Returns: The created requestor's id, name, email, and telephone (if provided).
Example:
{
"client_id": 123,
"name": "João Silva",
"email": "joao@empresa.com"
}update_requestor
Update an existing requestor (PUT /clients/{id}/requestors/{requestor_id}). Partial update — only the provided fields are sent. Use get_requestor to see the current state before updating.
Parameters:
client_id(number, required): Client the requestor belongs torequestor_id(number, required): Requestor ID to updatename(string, optional): Requestor nametelephone(string, optional): Requestor phone (digits only)email(string, optional): Requestor emailcan_open_ticket(boolean, optional): Whether the requestor can open tickets by emailextension(string, optional): Requestor extension
If no updatable field is provided, returns a friendly error.
Example:
{
"client_id": 123,
"requestor_id": 555,
"can_open_ticket": true
}update_requestor_entities
Update a requestor's custom fields (entities) (PUT /clients/{id}/requestors/{requestor_id}/entities). Supports up to 50 fields per request. For checkbox fields with multiple options, send one item per option with entity_field_id + entity_field_option_id + value: "true"/"false".
Prefer IDs when known to avoid resolution round-trips. Use entity_name/entity_field_name/entity_field_option_name for automatic resolution when you don't have the IDs — resolution is scoped to requestor entities (applied_in: "solicitant").
Parameters:
client_id(number, required): Client the requestor belongs torequestor_id(number, required): Requestor ID to updateentities(array, required): List of custom fields (seeupdate_client_entitiesfor the item shape)
Example:
{
"client_id": 123,
"requestor_id": 555,
"entities": [
{ "entity_field_id": 88, "value": "Premium" }
]
}search_stage
Search for stages of a specific desk to use in ticket updates.
Parameters:
desk_id(number, optional): Desk ID to search stagesdesk_name(string, optional): Desk name for automatic search (alternative to desk_id). Accepts partial names — e.g."cansados"resolves to"Dev - Cansados"(see Smart Name Resolution)limit(number, optional): Results per page (default: 20, max: 200)offset(number, optional): Page number (default: 1)
Note: At least one parameter (desk_id or desk_name) must be provided.
Example:
{
"desk_name": "Suporte",
"limit": 20
}search_catalog_item
Search for service catalog items by free-text term or by name/filter within a specific desk. Use search to explore items by keyword (server-side, matches catalog name, area name, or item name). Use catalog_item_name to locate a specific item by name (client-side, collapses to single detail when exactly 1 match).
Disambiguation: this tool is desk-scoped (items selectable in tickets of a specific desk). To list items for a specific catalog area across the whole organization (CRUD management), use
list_services_catalog_items. To list catalogs org-wide, uselist_services_catalogs.
Parameters:
desk_id(number, optional): Desk ID to search catalog itemsdesk_name(string, optional): Desk name for automatic search (alternative to desk_id). Accepts partial names — e.g."cansados"resolves to"Dev - Cansados"(see Smart Name Resolution)search(string, optional): Free-text term for server-side search across catalog name, area name, and item name. Partial match, case-insensitive, accent-insensitive. Returns a listing with full hierarchy (catalog → area → item). Combinable witharea_id/catalog_idto narrow scope.catalog_item_name(string, optional): Catalog item name to search (client-side partial match on item name only). 1 match → detailed view; multiple → error with list. Usesearchfor broader exploration.area_id(number, optional): Service area ID to filter resultscatalog_id(number, optional): Service catalog ID to filter resultslimit(number, optional): Results per page (default: 20, max: 200)offset(number, optional): Page number (default: 1)
Note: At least one of desk_id or desk_name must be provided, along with at least one of search, catalog_item_name, area_id, or catalog_id.
Example — free-text search (recommended for exploration):
{
"desk_name": "Support",
"search": "infra",
"limit": 10
}Example — locate a specific item by name:
{
"desk_name": "Support",
"catalog_item_name": "Installation",
"limit": 10
}Internal Communications
create_internal_communication
Create a new internal communication in a ticket.
Parameters:
ticket_number(string, required): Ticket number where communication will be createdtext(string, required): Communication content. Accepts Markdown (bold, lists, headings, code) — the MCP automatically converts it to HTML before sending to the API.files_base64(array, optional): Array of base64 encoded files[{content: "base64...", filename: "file.pdf"}](max 10 files, 25MB each)
New in v1.3.0: Support for base64 file upload via files_base64 parameter.
Breaking change (v2.8.0): O parametro
files(caminhos locais) foi removido. Use a nova toolupload_ticket_filespara enviar arquivos via base64, ou passe os arquivos diretamente viafiles_base64.
Example:
{
"ticket_number": "123",
"text": "Internal communication content",
"files_base64": [{"content": "base64...", "filename": "relatorio.pdf"}]
}list_internal_communications
List internal communications for a ticket.
Parameters:
ticket_number(string, required): Ticket number to list communicationsoffset(number, optional): Page number (default: 1)limit(number, optional): Communications per page (default: 20, max: 200)
get_ticket_files
Get all files attached to a specific ticket.
Parameters:
ticket_number(string, required): Ticket number to retrieve files from
Returns: List of files with details including:
File ID, name, content type
File size (formatted as KB/MB/GB)
URL for download
Created date and creator information
Example:
{
"ticket_number": "123"
}upload_ticket_files
Upload files to an existing ticket in Tiflux. Files must be provided as base64-encoded content.
Parameters:
ticket_number(string, required): Ticket number where files will be attached (e.g., "123", "456")files_base64(array, required): Array of base64 encoded files[{content: "base64...", filename: "file.pdf"}](max 10 files, 25MB each)
Example:
{
"ticket_number": "123",
"files_base64": [
{"content": "base64encodedcontent...", "filename": "relatorio.md"},
{"content": "base64encodedcontent...", "filename": "screenshot.png"}
]
}Returns: Confirmation with list of uploaded files.
Note: Uploaded text files (.md, .txt, .csv, .json) are sent with the appropriate charset=utf-8 content type, which prevents character encoding issues (mojibake) in the Tiflux portal.
delete_ticket_file
Remove a file attached to a ticket in Tiflux.
Parameters:
ticket_number(string, required): Ticket number from which the file will be removed (e.g., "123", "456")file_id(string, required): ID of the file to remove (obtained viaget_ticket_files)
Example:
{
"ticket_number": "123",
"file_id": "456"
}Returns: Confirmation that the file was removed.
get_ticket_stages_slas
List the full history of a ticket as it moved through the desk's stages, with the SLA outcome for each stage. Useful for SLA audits, escalation reviews, and bottleneck analysis.
Parameters:
ticket_number(string, required): Ticket number (e.g., "123", "456")offset(number, optional): Page number (default: 1)limit(number, optional): Records per page (default: 20, max: 200)
Returns: For each stage transition, the formatted output includes:
Stage name and desk
Time spent in expedient (
HH:MM)Whether the SLA was met (
✅ Sim/❌ Não)SLA expiration timestamp
When the ticket entered the stage and who moved it
When (if) the ticket was attended in this stage and by whom
Empty result: Tickets on desks without an active SLA return an empty list with an explanatory message — this is expected behavior, not an error.
Example:
{
"ticket_number": "32",
"offset": 1,
"limit": 20
}get_ticket_service_types
List the service types available for billing/valorization of an appointment on a ticket. Returns the active contract riders (with add-on number, validity, and ID) and the loose services (with ID and name) applicable on the given date. Useful for discovering which services or contracts can be referenced when creating a valued appointment.
Parameters:
ticket_number(string, required): Ticket number (e.g., "123", "456")date(string, optional): Reference date in ISO formatYYYY-MM-DD(default: today). Cannot be a future date.
Returns: Two sections in the formatted output:
📄 Contratos / Adendos vigentes — for each
contract_rider: contract name, add-on number (rider_number), validity period (start_date→cancel_date), and the add-on ID.🔧 Serviços avulsos — for each
loose_service:id+name.
Each list can be independently empty (shows "none found" for that section); both empty returns an explanatory message (no contracts/services applicable for that ticket on the given date).
Example:
{
"ticket_number": "123",
"date": "2026-08-04"
}get_ticket_shifts
List the displacements (travel/visit) available for valorization of an appointment on a ticket. Displacement is a valorization component representing the travel cost to the client. Useful for discovering which displacements can be referenced when creating a valued appointment. Sister tool of get_ticket_service_types.
Parameters:
ticket_number(string, required): Ticket number (e.g., "98875", "123")contract_id(number, optional): Contract ID (positive integer) to filter displacements linked to a specific contract. Omit to return all displacements applicable to the ticket. A non-integer value fails locally with a clear message, without calling the API.
Returns: List of available displacements. Each displacement includes:
nameandidreferencescope label (All = generic for all clients/contracts; Client = exclusive to the client; Contract = exclusive to the contract; Shared = group of contracts)Linked
contractorclientwhen present (not shown for generic "All" items)
Empty result returns a friendly explanatory message.
Example:
{
"ticket_number": "98875",
"contract_id": 88558
}get_ticket_checklists
List the checklists (forms) of a ticket, with all fields and their fill state. Useful for understanding which fields are pending and why a ticket cannot be closed — a checklist with pending: true means there is a required unfilled field blocking closure. Each field shows its index (the only way to reference it for writing), type, whether it is required, fill state, and the value or options depending on the field type. Option ids for checkbox and radio fields are exposed in the output so they can be used directly in update_ticket_checklist_item.
Parameters:
ticket_number(string, required): Ticket number (e.g., "98875", "123")offset(number, optional): Page number (default: 1)limit(number, optional): Checklists per page (default: 20, max: 200)
Returns: Per checklist:
Name, description,
required(informational — whether the checklist is required for the client/catalog item),pending(whether a required field is missing — this blocks closure), creation and update dates.
Per field (fields[]):
index: the positional reference for the field (the only identifier — not persistent across changes)title,type(text,textarea,value,radio,checkbox)Whether it is required and whether it is filled
Visual marker for required-but-unfilled fields (blocks ticket closure)
Value/options by type:
text/textarea/value: shows the filled value or "— vazio —"radio: shows the chosen option and lists all available options with their ids (e.g.,[id: 2] Média) for use inupdate_ticket_checklist_itemcheckbox: lists all options with their ids and marks which are checked (☑[id: a] E-mail) and which are not (☐[id: b] VPN);id: nullis also displayed (it is addressable via the API)
Example:
{
"ticket_number": "98875",
"offset": 1,
"limit": 20
}Empty result (no checklists) returns a friendly explanatory message. A ticket without checklists can be closed normally.
update_ticket_checklist_item
Fill or clear a single checklist field for a ticket. One field per call (1:1 with the API). Use get_ticket_checklists first to obtain checklist_id, index, and the option ids for checkbox/radio fields.
Important constraints:
Checklists without an
id(not originated from a template) cannot be updated.Fields of a closed ticket cannot be updated.
The payload is mutually exclusive: send either
valueORoptions, never both.
Parameters:
ticket_number(string, required): Ticket number (e.g., "98875")checklist_id(number, required): Checklist id as returned byget_ticket_checklistsindex(number, required): Field position within the checklist (fromget_ticket_checklists)value(string | number | null, optional): Value to fill. Use fortext,textarea,valuefields (any string/number) andradio(the option id). Sendnullto clear any field type. Mutually exclusive withoptions.options(array, optional): Forcheckboxfields only. Array of{ id, checked }— send only the options you want to change; others remain unchanged. Use the ids fromget_ticket_checklists. Mutually exclusive withvalue.
Payload by field type:
Field type | Payload |
|
|
|
|
|
|
Clear any field |
|
Examples:
// Fill a text field
{ "ticket_number": "98875", "checklist_id": 2, "index": 0, "value": "Client notified" }
// Select a radio option
{ "ticket_number": "98875", "checklist_id": 2, "index": 3, "value": "2" }
// Mark checkbox options
{ "ticket_number": "98875", "checklist_id": 2, "index": 4, "options": [{ "id": "a", "checked": true }, { "id": "b", "checked": false }] }
// Clear any field
{ "ticket_number": "98875", "checklist_id": 2, "index": 1, "value": null }Returns: The updated checklist with all fields and their new state, plus the pending status of the checklist (whether it still blocks ticket closure).
Errors:
404: Ticket or checklist not found422: Attribute incompatible with field type (e.g.,valuesent to acheckboxfield — useoptionsinstead)403: No permission or no Tickets license
list_ticket_answers
List answers (communications with the client) of a specific ticket, paginated.
Parameters:
ticket_number(integer, required): Ticket number to list answers fromoffset(number, optional): Page number (default: 1)limit(number, optional): Answers per page (default: 20, max: 200)
Returns: Each answer includes:
Author name, date/time, origin (
agent,client, etc.)File count indicator
Preview of the content (first 200 characters)
Pagination info with hint for next page
Example:
{
"ticket_number": 123,
"offset": 1,
"limit": 20
}get_ticket_answer
Get the full detail of a specific answer from a ticket, including attached files.
Parameters:
ticket_number(integer, required): Ticket numberanswer_id(integer, required): ID of the answer to retrieve
Returns:
Full answer content (untruncated), author, date, origin
Complete list of attached files with name, type, size and download URL
Example:
{
"ticket_number": 123,
"answer_id": 501
}delete_ticket_answer
Remove an answer (client communication) from a ticket in Tiflux.
Parameters:
ticket_number(string, required): Ticket number from which the answer will be removed (e.g., "123", "456")answer_id(string, required): ID of the answer to remove (obtained vialist_ticket_answersorget_ticket_answer)
Example:
{
"ticket_number": "123",
"answer_id": "501"
}Returns: Confirmation that the answer was removed.
delete_ticket_answer_file
Remove a file attached to a specific ticket answer in Tiflux.
Parameters:
answer_id(string, required): ID of the answer from which the file will be removed (obtained vialist_ticket_answersorget_ticket_answer)file_id(string, required): ID of the file to remove (obtained viaget_ticket_answer, fieldfiles[].id)
Example:
{
"answer_id": "501",
"file_id": "1"
}Returns: Confirmation that the file was removed.
get_ticket_histories
List the event history (timeline) of a ticket, showing field changes, stage transitions, and other events. Paginated.
Parameters:
ticket_number(integer, required): Ticket number to retrieve history forhistory_of(integer, required): History area to query —0= stage history,1= appointment historyoffset(number, optional): Page number (default: 1)limit(number, optional): Events per page (default: 20, max: 200)type_id_attr(integer, optional): Filter by attribute typeoperation(string, optional): Filter by operation type ("created","updated","deleted") — only considered whenhistory_of=1
Returns: For each event:
Action description, user, date/time, event type and operation
Diff of changed fields with old → new values
Example:
{
"ticket_number": 123,
"history_of": 0
}reopen_ticket
Reopen a closed or canceled ticket. Tickets that have been billed cannot be reopened.
Parameters:
ticket_number(integer, required): Ticket number to reopendisapproval_reason(string, optional): Required when reopening a ticket pending review (disapproval-based reopening)
Business Rules:
Tickets that have been billed cannot be reopened (API returns 422)
disapproval_reasonis mandatory when reopening a ticket that is pending review/approval
Example:
{
"ticket_number": 123,
"disapproval_reason": "The solution did not resolve the issue"
}get_internal_communication
Get a specific internal communication with full content.
Parameters:
ticket_number(string, required): Ticket number containing the communicationcommunication_id(string, required): ID of the internal communication to retrieve
update_internal_communication
Update the text of an existing internal communication in a ticket. Only the author of the communication can edit it.
Parameters:
ticket_number(string, required): Ticket number where the communication exists (e.g., "123", "456")communication_id(string, required): ID of the internal communication to update (obtained vialist_internal_communicationsorget_internal_communication)text(string, required): New content of the internal communication. Accepts Markdown (bold, lists, headings, code) — the MCP automatically converts it to HTML before sending to the API.
Example:
{
"ticket_number": "123",
"communication_id": "101",
"text": "Updated communication content with **important** details."
}Returns: Confirmation with updated communication content.
Note: The Tiflux API only allows the author of the communication to edit it. A 403 error will be returned if the authenticated user did not create the communication.
delete_internal_communication
Remove an internal communication from a ticket in Tiflux.
Parameters:
ticket_number(string, required): Ticket number from which the communication will be removed (e.g., "123", "456")communication_id(string, required): ID of the internal communication to remove (obtained vialist_internal_communications)
Example:
{
"ticket_number": "123",
"communication_id": "101"
}Returns: Confirmation that the internal communication was removed.
Appointments (Time Tracking)
create_appointment
Create a new appointment (work-hour record) on a specific ticket. Supports both non-valued (simple) and valued appointments (attended externally/remotely/internally, with contract or loose service billing, optional travel shift, guarantee flag, and manual value).
Parameters (required):
ticket_number(string, required): Ticket number where the appointment will be createddate(string, required): Appointment date inYYYY-MM-DDformat. Future dates are not allowed.init_time(string, required): Start time inHH:MMformat (e.g."09:00","14:30")end_time(string, required): End time inHH:MMformat. Must be greater than or equal toinit_time.description(string, required): Description of the work performed
Parameters (valorization — required for desks with valorization enabled):
attendance(integer, optional): Attendance type:1= External (presencial),2= Remote,3= Internal. Required on desks with valorization.attendance_kind(integer, optional): Service type:1= Loose (avulso),2= Contract. Required on desks with valorization.contract_rider_id(integer, optional): Contract add-on ID valid (in-period) on the appointment'sdate. Required whenattendance_kind=2. Usecontract_nameto resolve by name. Caution:get_ticket_service_typesmay list riders outside their validity period even when thedate=filter is used — always verifystart_date/cancel_dateof the chosen rider before using this field.loose_service_id(integer, optional): Loose service ID. Required whenattendance_kind=1. Useloose_service_nameto resolve by name.shift_id(integer, optional): Travel/displacement ID (visit cost). Only withattendance=1. Exclusive withshift_owner_ticket_number. Useshift_nameto resolve by name.shift_owner_ticket_number(integer, optional): Ticket number of another open ticket from the same client that already has the travel cost charged (carona). Only withattendance=1. Exclusive withshift_id.guarantee(boolean, optional): Guarantee appointment — value forced to zero, does not bill. Cannot be used together withvalue.value(number, optional): Manual value (0–9999999.99). Only withattendance_kind=1. If omitted, calculated automatically. Cannot be used withattendance_kind=2orguarantee=true.external_user_name(string, optional): Name of the executor in an external tool (max 255 chars, no<or>). Valid on any desk type.
Name resolution parameters (Smart Name Resolution):
shift_name(string, optional): Partial shift/displacement name — resolves toshift_id. Preference:shift_idwins if both given.loose_service_name(string, optional): Partial loose service name — resolves toloose_service_id. Preference:loose_service_idwins if both given.contract_name(string, optional): Partial contract name — resolves tocontract_rider_id. Preference:contract_rider_idwins if both given.
Cross-field rules (validated locally before API call):
attendance_kind=1(Loose) requiresloose_service_id; rejectscontract_rider_idattendance_kind=2(Contract) requirescontract_rider_id; rejectsloose_service_idandvalueshift_idandshift_owner_ticket_numberare mutually exclusive (never both)shift_idorshift_owner_ticket_numberrequiresattendance=1(External)valuerequires an explicitattendance_kind=1(rejected whenattendance_kindis omitted)guarantee=truerejectsvalueexternal_user_namemax 255 chars, no<or>
Contract rider out of validity period (item 5): If the chosen
contract_rider_idis cancelled or outside its validity period on the appointment'sdate, the API returns a422. The tool detects this and returns a descriptive error, reminding you to checkstart_date/cancel_dateof the rider — and thatget_ticket_service_typesmay include expired riders even with thedate=filter active.
Desks with valorization enabled: When the ticket's desk requires valorization, calling
create_appointmentwithoutattendanceandattendance_kindresults in a422from the API. The tool catches this and returns a guided error message:❌ Esta mesa exige informações de valorização A mesa do ticket #X está configurada com valorização de apontamentos, então `attendance` e `attendance_kind` são obrigatórios. • `attendance`: 1 = Externo (presencial), 2 = Remoto, 3 = Interno • `attendance_kind`: 1 = Avulso (exige `loose_service_id`), 2 = Contrato (exige `contract_rider_id`)Note:
attendanceandattendance_kindremain optional in the schema because desks without valorization reject them at the API level — the tool cannot know the desk's configuration before the API call.
Example (valued appointment — loose service):
{
"ticket_number": "258",
"date": "2026-08-17",
"init_time": "09:00",
"end_time": "11:00",
"description": "On-site support — network configuration",
"attendance": 1,
"attendance_kind": 1,
"loose_service_name": "Suporte TI Basico",
"shift_name": "Deslocamento Joinville"
}list_appointments
List appointments (work-hour records) of a specific ticket with optional filters. When available, each appointment card includes valorization details (attendance type, contract or loose service, travel shift, value) and geolocation entries.
Parameters:
ticket_number(string, required): Ticket number to list appointments fromuser_id(number, optional): Filter by the ID of the user who made the appointmentstart_date(string, optional): Return appointments from this date (YYYY-MM-DD)end_date(string, optional): Return appointments up to this date (YYYY-MM-DD)offset(number, optional): Page number (default: 1)limit(number, optional): Appointments per page (default: 20, max: 200)
Returns:
Each appointment card shows date, time range, attendant, client (when available), and description. When external_user_name is present it is shown as a separate line outside the valorization block (valid on any desk type). When the desk has valorization enabled, the card also includes:
Attendance type: External (Externo), Remote (Remoto), or Internal (Interno)
Service type: Loose (Avulso) with loose service name, or Contract with contract name
Travel shift name and value (
shift) when applicable — or "Deslocamento de: #N — Title" whenshift_owner_ticketis set (carona)Guarantee and manual-value flags (shown only when
true)Monetary value formatted as
R$ X,XX
When valorization is null (desks configured without valorization), none of the above fields are shown.
Geolocation lines (📍 Localização: lat, lon) are rendered when the API returns locations for the appointment.
Example:
{
"ticket_number": "123",
"start_date": "2025-01-01",
"end_date": "2025-01-31",
"limit": 50
}list_appointments_global
List all appointments across all tickets for a date range with optional filters by technician, desk, client and contract. Requires permission to access the global appointments endpoint. Use list_appointments_report for an aggregated summary by technician (N2 support report).
Permission note: Requires access to the
GET /appointmentsendpoint. Users without the "Visualizar relatórios dos técnicos" (view_users_manage) permission may have theiruser_idsfilter silently ignored by the API, receiving only their own appointments. Whenuser_idsoruser_namesis provided and the API returns data, the tool emits an advisory note about this behavior. Non-admin users may receive403if the route itself is blocked at the permission level.
Parameters:
start_date(string, required): Start date of the period (YYYY-MM-DD)end_date(string, required): End date of the period (YYYY-MM-DD)user_ids(string, optional): Comma-separated technician IDs (max 15). Useuser_namesfor name-based resolution.user_names(string, optional): Comma-separated technician names for automatic resolution (alternative touser_ids). Ambiguity returns a disambiguation list.desk_ids(string, optional): Comma-separated desk IDs (max 15). Usedesk_namesfor name-based resolution.desk_names(string, optional): Comma-separated desk names for automatic resolution (alternative todesk_ids).client_ids(string, optional): Comma-separated client IDs (max 15). Useclient_namesfor name-based resolution. Note (A2): when this filter is active, appointments without a contract are excluded from results. Note (A1 — Shared contracts): in Shared contract mode, thecontract.idreturned may differ from the id you filtered on — the API expands the group to its member, which is expected behavior; do NOT filter client-side bycontract.idequality.client_names(string, optional): Comma-separated client names for automatic resolution (alternative toclient_ids). Max 15 resolved clients — more than that is rejected with an explicit error (never silently truncated, same rule asclient_ids).client_idstakes precedence when both are provided.contract_ids(string, optional): Comma-separated contract IDs (max 15). Note (A2): appointments without a contract are excluded when this filter is active. Note (A1): in Shared contracts,contract.idon returned items may differ from the filtered id (API expands group→member) — this is NOT an error.include_valorization(boolean, optional): Include valorization data (attendance type, value). Default:false.offset(number, optional): Page number (default: 1)limit(number, optional): Results per page (default: 20, max: 200)
Returns:
Paginated list of appointments. Each item shows: appointment ID, date, time range, technician name, client, contract name (or "sem contrato" when none), desk, ticket number and title, description (truncated at 120 chars). When present, external_user_name is shown as a separate line. Valorization summary appears when include_valorization=true: attendance type, monetary value, 🛡️ Garantia (when guarantee=true), ✋ Valor manual (when manual_value=true), and shift_owner_ticket when set. The ✋ Valor manual flag indicates the value was entered manually by the user (bypassing the contract rate), as opposed to being calculated from the contract tariff — critical signal for billing analysis. When contract_ids is active, a footer warns that appointments without a contract are not shown.
Example:
{
"start_date": "2026-07-01",
"end_date": "2026-07-31",
"client_names": "Acme Corp",
"contract_ids": "55082",
"limit": 50
}list_appointments_report
Generate an aggregated N2 support report: count and total hours per technician for a date range, with optional desk sub-breakdown and grand totals. Supports filtering by client and contract. Ideal for recurring N2 support metrics (how many times and how many hours each N2 technician assisted others in a period).
Permission note: Same as
list_appointments_global. Non-admin users without route-level permission receive a403error.
Parameters:
start_date(string, required): Start date of the period (YYYY-MM-DD)end_date(string, required): End date of the period (YYYY-MM-DD)user_ids(string, optional): Comma-separated N2 technician IDs (max 15). Useuser_namesfor name-based resolution.user_names(string, optional): Comma-separated N2 technician names for automatic resolution.desk_ids(string, optional): Comma-separated desk IDs (max 15) to enable desk sub-breakdown in the report. Usedesk_namesfor name-based resolution.desk_names(string, optional): Comma-separated desk names for automatic resolution (enables desk sub-breakdown).client_ids(string, optional): Comma-separated client IDs (max 15). Useclient_namesfor name-based resolution. See caveats A1/A2 inlist_appointments_global.client_names(string, optional): Comma-separated client names for automatic resolution (alternative toclient_ids). Max 15 resolved clients — more than that is rejected with an explicit error (never silently truncated).contract_ids(string, optional): Comma-separated contract IDs (max 15). Appointments without a contract are excluded when active. See caveat A1 inlist_appointments_global.include_valorization(boolean, optional): Include total value per technician (and per desk when breakdown enabled). Default:false.
Returns: Markdown report with:
Global totals: total appointments count, total hours, total value with manual sub-total in parentheses when applicable (e.g.
**Valor total:** R$ 1.200,00 (R$ 400,00 em valor manual))Per-technician section (sorted by appointment count desc): appointment count, total hours, total value — with
(R$ X manual)suffix when any manual-value appointment exists for that technicianDesk sub-breakdown per technician (shown only when
desk_ids/desk_namesprovided): count + hours + value per desk, with manual suffix when applicableWarning footer when
contract_idsis active: appointments without a contract are excluded from the aggregation (same notice aslist_appointments_global— relevant for billing audits, since totals may be under-reported)Footer with real-time data notice
The manual_value breakdown (when include_valorization=true) makes it immediately clear how much of the billed total came from manually-entered values vs. contract-calculated rates — important for billing audits.
The report paginates through all available data automatically (no offset/limit needed — all pages are fetched internally before aggregating).
Example:
{
"start_date": "2026-07-01",
"end_date": "2026-07-31",
"user_names": "Fernando N2, Peterson N2",
"desk_names": "Suporte - Dúvidas"
}list_pre_appointments
List open (in-progress) time records for a specific ticket. A pre-appointment represents a running stopwatch: init_time is filled in and end_time is null (meaning the timer is still running). Once stopped, it becomes a consolidated appointment (see list_appointments for closed records).
Permission note: Requires the "Criar e editar apontamentos" (create and edit appointments) permission and a Tickets license. If your API key returns a
403, check these permissions or use an admin key.
Parameters:
ticket_number(string, required): Ticket number to list pre-appointments fromoffset(number, optional): Page number (default: 1)limit(number, optional): Pre-appointments per page (default: 20, max: 200)
Returns:
Markdown table with 5 columns: ID, Data (date), Inicio (start time), Fim (end time), Usuario (user name). When end_time is null (or an empty string), the cell shows "em andamento" — this is the normal state of an open pre-appointment, not missing data. Null fields in date, init_time, or user.name are shown as —. Cell values are escaped (| and line breaks) so API data cannot break the table layout. Footer includes pagination info with total count from the X-Total-Items response header.
When no pre-appointments exist for the ticket, a friendly message is returned (not an error).
Example:
{
"ticket_number": "258"
}Typical output:
**Pre-apontamentos do Ticket #258 (1 de 1)**
| ID | Data | Inicio | Fim | Usuario |
|---|---|---|---|---|
| 3 | 2026-07-07 | 14:35 | em andamento | Velda Windler |Chats
get_chat
Exibir detalhes de um chat específico pelo id. Retorna card com status, cliente, responsável, departamento, origem, avaliação e datas.
Parameters:
id(number, required): Numeric ID of the chat (also accepts numeric string — the handler calls parseInt)
Returns: Card with all relevant chat fields including:
Status (archived, canceled, online, waiting for answer)
Client and requestor names
Department and responsible attendant
Origin channel (the API returns
originas an object{ integration_id, _type, fields }; the card displays_type, e.g.whatsapp,site_widget,chat) and roomLinked ticket (number + title, e.g.
#127 — Erro no login); title is normalized to a single line and truncated at 150 chars; showsSem ticket vinculadowhen no ticket is linkedAssessment rating (1–5) if available
Last client message (truncated at 150 chars)
Timestamps (created, updated, assumed). Note:
assumed_atinget_chatmay differ from the listing tools for legacy chats (assumed before the column existed) — theget_chatview synthesizes the current timestamp when the column is null but a responsible is set; the listings return the raw column value.
Example:
{
"id": 42
}list_inbox_chats
Listar chats na caixa de entrada (chats não assumidos) com filtros opcionais de departamento, cliente, origem, data e paginação.
Parameters:
offset(number, optional): Page number (default: 1, minimum: 1)limit(number, optional): Chats per page (default: 20, max: 200)department_id(number, optional): Filter by department ID. To discover the ID from a name, uselist_departments(e.g.list_departments name:"financeiro")client_id(number, optional): Filter by client IDrequestor_id(number, optional): Filter by requestor ID — must be greater than 0number(number, optional): Filter by WhatsApp contact number — requires WhatsApp licenseorigins(string, optional): Comma-separated origin channels:chat,site_widget,campaign,whatsapp,whatsapp_web,gupshup,whatsapp_cloudstarted_by(string, optional): Chat initiator type:Client,Attendant,Campaign,APIcreated_at_start(string, optional): Filter chats created on or after this datetime. Recommended format: ISO 8601YYYY-MM-DDTHH:MM:SSZcreated_at_end(string, optional): Filter chats created on or before this datetime. Recommended format: ISO 8601YYYY-MM-DDTHH:MM:SSZ. Must be >=created_at_start
Returns:
Paginated list of chats. Each item includes origin (displayed as _type, e.g. chat, whatsapp), online/waiting status, client, requestor, department, last client message (truncated at 150 chars), creation date, and — when the chat has a linked ticket — Ticket: #<number> — <title> (title normalized to a single line and truncated at 150 chars; the whole line is omitted when no ticket is linked). Assumido em: is omitted for inbox chats because they are not yet assumed.
Example:
{
"origins": "whatsapp",
"created_at_start": "2026-06-01T00:00:00Z",
"created_at_end": "2026-06-30T23:59:59Z",
"limit": 10
}list_my_chats
Listar chats assumidos pelo usuário autenticado (dono da API key) com filtros opcionais e paginação.
Parameters:
offset(number, optional): Page number (default: 1, minimum: 1)limit(number, optional): Chats per page (default: 20, max: 200)department_id(number, optional): Filter by department ID. To discover the ID from a name, uselist_departments(e.g.list_departments name:"financeiro")client_id(number, optional): Filter by client IDrequestor_id(number, optional): Filter by requestor ID — must be greater than 0number(number, optional): Filter by WhatsApp contact number — requires WhatsApp licenseorigins(string, optional): Comma-separated origin channels (see list_inbox_chats)started_by(string, optional): Chat initiator type (see list_inbox_chats)created_at_start(string, optional): Filter chats created on or after this datetime. Recommended format: ISO 8601YYYY-MM-DDTHH:MM:SSZcreated_at_end(string, optional): Filter chats created on or before this datetime. Recommended format: ISO 8601YYYY-MM-DDTHH:MM:SSZ. Must be >=created_at_start
Returns:
Paginated list of chats assumed by the authenticated user. Each item includes origin (displayed as _type, e.g. whatsapp, chat), online/waiting status, client, requestor, department, last client message (truncated at 150 chars), creation date, Assumido em: timestamp (raw column from the API — may differ from get_chat for legacy chats), and — when the chat has a linked ticket — Ticket: #<number> — <title> (title normalized to a single line and truncated at 150 chars; the whole line is omitted when no ticket is linked).
Example:
{
"department_id": 3,
"created_at_start": "2026-06-01T00:00:00Z",
"limit": 20
}list_in_attendance_chats
Listar todos os chats em atendimento da organização com filtros opcionais de responsável, status, data e paginação.
Parameters:
offset(number, optional): Page number (default: 1, minimum: 1)limit(number, optional): Chats per page (default: 20, max: 200)department_id(number, optional): Filter by department ID. To discover the ID from a name, uselist_departments(e.g.list_departments name:"financeiro")client_id(number, optional): Filter by client IDrequestor_id(number, optional): Filter by requestor ID — must be greater than 0number(number, optional): Filter by WhatsApp contact number — requires WhatsApp licenseorigins(string, optional): Comma-separated origin channels (see list_inbox_chats)started_by(string, optional): Chat initiator type (see list_inbox_chats)user_id(number, optional): Filter by responsible attendant IDstatus(string, optional): Filter by attendance status:waiting_client,waiting_attendance,triagecreated_at_start(string, optional): Filter chats created on or after this datetime. Recommended format: ISO 8601YYYY-MM-DDTHH:MM:SSZcreated_at_end(string, optional): Filter chats created on or before this datetime. Recommended format: ISO 8601YYYY-MM-DDTHH:MM:SSZ. Must be >=created_at_start
Returns:
Paginated list of all chats currently in attendance in the organization. Each item includes origin (displayed as _type, e.g. whatsapp, site_widget), online/waiting status, client, requestor, department, last client message (truncated at 150 chars), creation date, Assumido em: timestamp (raw column from the API — may differ from get_chat for legacy chats), and — when the chat has a linked ticket — Ticket: #<number> — <title> (title normalized to a single line and truncated at 150 chars; the whole line is omitted when no ticket is linked).
Example:
{
"user_id": 7,
"status": "triage",
"created_at_start": "2026-06-15T00:00:00Z"
}list_archived_chats
Listar chats arquivados (finalizados ou cancelados) com filtros opcionais de data de criação e finalização. Exibe avaliação do atendimento e status de cancelamento.
Parameters:
offset(number, optional): Page number (default: 1, minimum: 1)limit(number, optional): Chats per page (default: 20, max: 200)department_id(number, optional): Filter by department ID. To discover the ID from a name, uselist_departments(e.g.list_departments name:"financeiro")client_id(number, optional): Filter by client IDrequestor_id(number, optional): Filter by requestor ID — must be greater than 0number(number, optional): Filter by WhatsApp contact number — requires WhatsApp licenseorigins(string, optional): Comma-separated origin channels (see list_inbox_chats)started_by(string, optional): Chat initiator type (see list_inbox_chats)canceled(boolean, optional):true= only canceled chats,false= only normally finished, omitted = all archived chatscreated_at_start(string, optional): Filter chats created on or after this datetime. Recommended format: ISO 8601YYYY-MM-DDTHH:MM:SSZcreated_at_end(string, optional): Filter chats created on or before this datetime. Recommended format: ISO 8601YYYY-MM-DDTHH:MM:SSZ. Must be >=created_at_startfinished_at_start(string, optional): Filter chats finished on or after this datetime. Recommended format: ISO 8601YYYY-MM-DDTHH:MM:SSZ. Only applicable to archived chatsfinished_at_end(string, optional): Filter chats finished on or before this datetime. Recommended format: ISO 8601YYYY-MM-DDTHH:MM:SSZ. Must be >=finished_at_start. Only applicable to archived chats
Returns:
Paginated list of archived chats. Each item includes origin (displayed as _type, e.g. whatsapp, chat), canceled/assessment status, client, requestor, department, last client message (truncated at 150 chars), creation date, Assumido em: timestamp (raw column from the API — may differ from get_chat for legacy chats), and — when the chat has a linked ticket — Ticket: #<number> — <title> (title normalized to a single line and truncated at 150 chars; the whole line is omitted when no ticket is linked).
Example:
{
"canceled": false,
"created_at_start": "2026-06-01T00:00:00Z",
"created_at_end": "2026-06-30T23:59:59Z",
"finished_at_start": "2026-06-15T00:00:00Z",
"limit": 50
}list_chat_messages
Listar as mensagens de um chat em ordem cronológica (transcrição da conversa). Retorna autor, horário, texto ou referência de anexo, reply citado e status de entrega quando disponível. Suporta paginação offset/limit.
Parameters:
id(number, required): Numeric ID of the chat (also accepts numeric string — the handler calls parseInt)offset(number, optional): Page number (default: 1, minimum: 1)limit(number, optional): Messages per page (default: 20, max: 200)
Returns: Conversation transcript in Markdown. Each message includes:
Author + role in Portuguese (client → Cliente, attendant → Atendente, system → Sistema, ai → IA), including the name when available
Timestamp (
created_at)Message text (truncated at 150 chars) or attachment reference
[anexo: <caption> (<content_type>)]whenmedia ≠ null↩ resposta a: "<excerpt>"whenquoted_messageis present (excerpt truncated at 80 chars)Delivery status when relevant (lido / entregue / ⚠ falhou)
Errors: 404 when the chat does not exist, 403 when the account lacks permission or WhatsApp license.
Example:
{
"id": 42,
"offset": 1,
"limit": 50
}update_chat
Atualizar um chat existente: transferir o atendente (user_id), transferir o departamento (department_id) e/ou vincular o chat a um ticket (ticket_number). Só é possível atualizar um chat que não esteja cancelado ou encerrado.
Parameters:
id(number, required): Chat ID (accepts numeric string — handler runsparseInt)user_id(number, optional): Attendant the chat will be transferred touser_name(string, optional): Attendant name for automatic lookup (alternative touser_id;user_idtakes precedence). Caveat (BL-007): requires an admin API key —GET /usersreturns 403 for non-admin accounts; in that case useuser_iddirectly.department_id(number, optional): Department the chat will be transferred to. Nodepartment_name— to find the ID from a name, uselist_departmentsfirst (e.g.list_departments name:"financeiro").ticket_number(number, optional): Ticket number to link to the chat
Note: At least one of user_id / user_name / department_id / ticket_number is required. If none is provided, the tool returns a friendly warning without calling the API.
Example:
{
"id": 37,
"user_id": 1,
"ticket_number": 127
}Returns: Markdown confirmation with the list of applied changes.
send_message
Enviar uma mensagem por WhatsApp, criando o chat no envio. Use mensagem livre (message) ou modelo HSM / modelo de chat (template_id), nunca os dois juntos.
messageé texto plano (NÃO Markdown/HTML). O WhatsApp usa marcação própria (asterisco para negrito, underscore para itálico); HTML apareceria literal. Por isso, diferentemente dedescription/answerde ticket, o conteúdo não é convertido para HTML.
Parameters:
number(number, required): Destination phone number. Validated as Brazilian by default; for another country also passcountry_code.integration_id(number, required): WhatsApp integration ID. Accepted types:gupshup,whatsapp_cloud.message(string, optional): Free-text message (plain text). UsemessageORtemplate_id.template_id(number, optional): HSM / chat template ID. Useparameters/header_parametersfor variables.country_code(string, optional): ISO 3166-1 alpha-2 country code (e.g.US). DefaultBR.name(string, optional): Requester name.department_id(number, optional): Link the created chat to a department.ticket_number(number, optional): Link the created chat to a ticket.client_id(number, optional): Link the created chat to a client.parameters(string[], optional): Values for the HSM body variables (template_id).header_parameters(string[], optional): Values for the HSM header variables —whatsapp_cloudonly.archive(boolean, optional): Defaultfalse.true= create and send straight to the finished/archived box.
Note: Besides number + integration_id, at least one of message / template_id is required (validated locally). Success status from the API: 201.
Example (free message):
{
"number": 5568976728276,
"integration_id": 1,
"message": "Olá, tudo bem?"
}Example (HSM template with parameters):
{
"number": 5519993017428,
"integration_id": 1,
"template_id": 1,
"parameters": ["Valor 1", "Valor 2"]
}Returns: Markdown confirmation with the send details (type, number, integration, links).
archive_chat
Finalizar (encerrar) um chat. A API responde 202 (Accepted) — o encerramento pode ser processado de forma assíncrona; o tool trata 202 como sucesso.
Parameters:
id(number, required): Chat ID to finish (accepts numeric string — handler runsparseInt)services_catalogs_item_id(number, optional): Service catalog item ID. Conditional: required only when the organization is configured to "Usar catálogo de serviços no chat" — otherwise the API returns 422. Nocatalog_item_name: catalog item search requires adesk_id, which the chat does not provide; pass the ID directly when needed.
Example:
{
"id": 37,
"services_catalogs_item_id": 1
}Returns: Markdown confirmation that the chat was finished (202 Accepted).
get_chats_feedback_report
Relatório de avaliações de atendimento (CSAT) de chats com comparação automática de período. Retorna métricas de satisfação (média, avaliados, finalizados, taxa de resposta) com deltas entre dois períodos, e opcionalmente a lista de chats avaliados.
When to use vs other tools:
CSAT / satisfaction ratings for CHATS →
get_chats_feedback_report(this tool)CSAT / satisfaction ratings for TICKETS →
get_tickets_feedback_reportTicket count / trend comparison →
get_tickets_comparison
Default comparison period: if compare_start_date/compare_end_date are not provided, the comparison period is the immediately preceding period of the same duration. Provide only start_date and end_date and the comparison window is calculated automatically.
No filter by rating in the API — to filter by rating, use include_list=true and filter the returned list by rating client-side (e.g., "show only chats with rating < 3").
Note: The comments field (evaluation comment) is not available in the chats report — only in the tickets report.
Enrichment workflow:
Run with
include_list=trueto get the list of evaluated chats (withrating,rating_time, client, responsible, linked ticket number).For full chat details (requestor, department, service catalog, origin, timestamps) → use
get_chatwith theidreturned.
Note: This report requires administrator/reports permission — non-admin API keys receive 403.
Parameters:
start_date(string, required): Start of the main period (YYYY-MM-DD, e.g., "2026-07-01")end_date(string, required): End of the main period (YYYY-MM-DD, e.g., "2026-07-31")compare_start_date(string, optional): Start of comparison period (YYYY-MM-DD). Must be provided withcompare_end_date. If omitted, the immediately preceding period of the same duration is used.compare_end_date(string, optional): End of comparison period (YYYY-MM-DD). Pair withcompare_start_date.include_list(boolean, optional): If true, includes the paginated list of evaluated chats in the main period. Default: false.offset(integer, optional): Page number for the list (default: 1). Only relevant withinclude_list=true.limit(integer, optional): Items per page (default: 20, max: 200). Only relevant withinclude_list=true.responsible_ids(string, optional): Comma-separated responsible user IDs (max 15). Applied to both calls (main + comparison).department_ids(string, optional): Comma-separated department IDs (max 15). Applied to both calls.technical_group_ids(string, optional): Comma-separated technical group IDs (max 15). Applied to both calls.
Example — compare this week vs last week:
{
"start_date": "2026-07-07",
"end_date": "2026-07-13"
}Example — get list of evaluated chats to filter by rating client-side:
{
"start_date": "2026-07-01",
"end_date": "2026-07-31",
"include_list": true,
"limit": 100
}Rich response example:
**📊 Relatório de avaliações de atendimento — Chats**
**Período principal:** 2026-07-01 a 2026-07-31
**Período de comparação:** 2026-05-31 a 2026-06-30
| Métrica | Período atual | Período anterior | Δ |
|---------|--------------|-----------------|---|
| Média de avaliação | **4.5** | 4.0 | +0.5 (+12.5%) |
| Chats avaliados | **20** | 15 | +5 (+33.3%) |
| Chats finalizados | **100** | 80 | +20 (+25%) |
| Clientes avaliadores | **15** | 12 | +3 (+25%) |
| Taxa de resposta (%) | **80.0** | 75.0 | +5 (+6.7%) |
*✅ Dados obtidos da API TiFlux em tempo real*Desk Tools
Explore and inspect desks (service queues) without leaving the chat. Use list_desks to discover available desks, get_desk to inspect full configuration, list_desk_priorities to discover priority IDs before creating tickets, and list_desk_services_catalogs to list service catalog containers linked to a desk.
list_desks
Listar mesas (desks) disponiveis no tenant para descoberta e exploracao. Retorna tabela com id, nome, display name, status ativo e tipo de atendimento. Use antes de criar tickets ou para explorar quais mesas existem. Para localizar uma mesa por nome (parcial/fuzzy), use get_desk com desk_name.
Parameters:
active(boolean, optional): Filter active (true) or inactive (false) desks. Default:true(active only)limit(number, optional): Results per page (default: 20, max: 200)offset(number, optional): Page number (default: 1)
Returns: Markdown table with id, name, display_name, active status and appointment_type.
Example:
{
"active": true,
"limit": 50
}get_desk
Retornar configuracoes completas de uma mesa (30+ campos) agrupadas em secoes: Identificacao, Atendimento, SLA, Comportamento de tickets e Campos obrigatorios no formulario. Campos vazios ou falsy sao omitidos automaticamente.
Accepts desk_id (direct) or desk_name (fuzzy, uses the same Smart Name Resolution mechanism). If both are provided, desk_id takes precedence.
Parameters:
desk_id(number, optional): Numeric desk ID. If provided, used directly without name resolutiondesk_name(string, optional): Partial, full or multi-word desk name (tokens in any order) — e.g."cansados"or"dev cansados"resolve to"Dev - Cansados";"dev experimentos"resolves to"DEV - Experimentos"(see Smart Name Resolution). Alternative to desk_id
Note: At least one of desk_id or desk_name is required.
Returns: Markdown with sections covering:
Identificacao: name, display name, description, active status, internal desk flag, receiving new tickets
Atendimento: appointment type, attendance type, permissions, cancelable tickets, feedback, e-mail settings, desk exchange
SLA: SLA active flag, SLA goal, can stop SLA, SLA time tracking
Comportamento de tickets: ticket review settings, reopening rules, time limits, billing behavior
Campos obrigatorios no formulario: required fields, service catalog requirements
Example:
{
"desk_id": 3
}Or using fuzzy name resolution:
{
"desk_name": "cansados"
}list_desk_priorities
Listar prioridades configuradas em uma mesa do Tiflux. Use para descobrir os IDs de prioridade antes de criar ou atualizar tickets (ex: "alta prioridade" → priority_id). O filtro priority_name e feito client-side com fuzzy match apos buscar os registros da API.
Accepts desk_id (direct) or desk_name (fuzzy). If both are provided, desk_id takes precedence.
Parameters:
Parameter | Type | Required | Default | Description |
| number | one of | — | Numeric desk ID. Used directly, no name lookup |
| string | one of | — | Partial or exact desk name (fuzzy resolved). Alternative to |
| string | no | — | Optional fuzzy filter on priority name (client-side). E.g. |
| number | no | 20 | Results per page (max: 200) |
| number | no | 1 | Page number |
Returns: Markdown table with id, name, order, start_time, end_time.
Example — list all priorities by desk_id:
{
"desk_id": 3
}Example — filter by priority name using desk_name:
{
"desk_name": "suporte",
"priority_name": "alta"
}Example response:
| ID | Nome | Ordem | Inicio | Fim |
|---|---|---|---|---|
| 17 | High | 1 | 04:00 | 24:00 |
| 18 | Low | 2 | 10:00 | 48:00 |list_desk_services_catalogs
Listar catalogos de servicos vinculados a uma mesa do Tiflux. Catalogos sao os containers pai — diferentes dos itens de catalogo (use search_catalog_item para itens selecionaveis em tickets). O filtro catalog_name e feito client-side com fuzzy match.
Disambiguation: this tool is desk-scoped (catalogs linked to a specific desk, operations view). To list, create, update or delete catalogs org-wide (configuration/management view), use
list_services_catalogsand the other*_services_catalog*tools.
Accepts desk_id (direct) or desk_name (fuzzy). If both are provided, desk_id takes precedence.
Parameters:
Parameter | Type | Required | Default | Description |
| number | one of | — | Numeric desk ID. Used directly, no name lookup |
| string | one of | — | Partial or exact desk name (fuzzy resolved). Alternative to |
| string | no | — | Optional fuzzy filter on catalog name (client-side). E.g. |
| number | no | 20 | Results per page (max: 200) |
| number | no | 1 | Page number |
Returns: Markdown table with id, name.
Example — list all catalogs:
{
"desk_name": "suporte"
}Example — filter by catalog name:
{
"desk_id": 3,
"catalog_name": "infra"
}Example response:
| ID | Nome |
|---|---|
| 6 | Catalogo 1 |
| 7 | Catalogo 2 |Department Tools
Discover department IDs by name — required for filtering chats by department. The two-step flow: list_departments(name:"financeiro") → get id → list_my_chats(department_id:...).
list_departments
Listar departamentos da organização com filtro opcional de busca parcial por nome. Use para descobrir o department_id a partir de um nome antes de filtrar chats. Retorna tabela ID | Nome.
Permissions: Admin API keys return all active departments. Technical (non-admin) keys return only departments linked to their attendant group.
Parameters:
name(string, optional): Partial name search, case-insensitive (e.g."financeiro","suporte"). Max 255 characters.limit(number, optional): Results per page (default: 20, max: 200)offset(number, optional): Page number (default: 1)
Returns: Markdown table with ID and Nome columns.
Example:
{
"name": "financeiro"
}Example response:
| ID | Nome |
|---|---|
| 3 | Financeiro |Use the id as department_id in list_inbox_chats, list_my_chats, list_in_attendance_chats, or list_archived_chats.
Knowledge Base Tools
Search and manage the organization's knowledge base articles. Without the "Gerenciar base de conhecimento" permission, only public articles and those from the user's attendant group are returned.
API limitations (v2): There is no endpoint for uploading images or attachments; images must be embedded by URL (Markdown ). To edit an existing article, use update_knowledge. To archive an article (soft-delete), use delete_knowledge.
list_knowledges
List knowledge base articles with optional search and folder filters. Returns a Markdown table with ID, title, visibility, folders, tags, and last updated date.
Permissions: Without "Gerenciar base de conhecimento" — only public articles and those from the user's attendant group. With the permission — all articles.
Note: The description field returned by the API is truncated at 300 characters (preview only — partial content).
Parameters:
search(string, optional): Search by title, tags, or beginning of the description (case-insensitive).knowledge_folder_ids(array of numbers, optional): Filter by folder IDs. Example:[1, 2].limit(number, optional): Results per page (default: 20, max: 200).offset(number, optional): Page number (default: 1).
Returns: Markdown table with columns ID | Titulo | Privado | Pastas | Tags | Atualizado.
Example:
{
"search": "VPN",
"knowledge_folder_ids": [1],
"limit": 10
}Example response:
| ID | Titulo | Privado | Pastas | Tags | Atualizado |
|---|---|---|---|---|---|
| 101 | Como configurar VPN | Sim | 1, 2 | VPN, acesso remoto | 01/06/2026 |A descricao e exibida truncada em ate 300 caracteres pela API (preview parcial).
get_knowledge
Fetch the full detail of a knowledge base article by ID. The description body is returned in Markdown (converted from HTML by the MCP — no raw HTML noise in context).
Important: To edit an existing article, use update_knowledge. To archive (soft-delete) an article, use delete_knowledge.
Parameters:
knowledge_id(number, required): ID of the knowledge article (obtained fromlist_knowledges).
Returns: Article detail with title, visibility, tags, creation/update dates, and the full body in Markdown.
Note on links: the HTML→Markdown conversion is not a general-purpose HTML sanitizer (final sanitization is the MCP client renderer's responsibility), but it does neutralize the one vector that survives conversion: links and images with an executable URI scheme (javascript:, vbscript:, and data: for links) lose the URL and keep only the visible text/alt. Regular http(s) links and inline data:image/... images are preserved.
Example:
{ "knowledge_id": 101 }Example response:
**Conhecimento: Como configurar VPN**
**ID:** 101
**Visibilidade:** Privado
**Tags:** VPN, acesso remoto
**Criado em:** 10/01/2026
**Atualizado em:** 01/06/2026
---
## Introducao
Este guia cobre a configuracao de VPN...delete_knowledge
Archive (soft-delete) a knowledge base article by ID. Requires the "Gerenciar conhecimento" permission.
⚠ Warning: The archiving is irreversible via the API — there is no restore endpoint. The article is also unlinked from all folders where it was published. To edit the article before archiving, use update_knowledge.
A pre-flight lookup fetches the article title before the DELETE (for the confirmation message). If the pre-flight fails, the DELETE proceeds anyway.
Parameters:
knowledge_id(number, required): ID of the knowledge article to archive (obtained fromlist_knowledgesorget_knowledge).
Returns: Confirmation message with the article ID and title, listing the effects (archived + unlinked from folders).
Example:
{ "knowledge_id": 101 }Errors:
404: Article not found or not visible to the user. Without the "Gerenciar base de conhecimento" permission, only public articles and those in the user's attendant groups are accessible.403: Missing the "Gerenciar base de conhecimento" permission.
get_knowledge_folder
Fetch the full detail of a knowledge base folder by ID, including the list of articles published in it.
Parameters:
folder_id(number, required): ID of the knowledge folder (obtained fromlist_knowledge_folders).
Returns: Folder detail with title, description, icon, tags, total article count, and a table of visible articles (ID | Titulo). If qty_knowledges is greater than the number of listed articles, the user lacks permission to see all of them — both numbers are shown.
Example:
{ "folder_id": 1 }Example response:
**Pasta de Conhecimento: Rede e VPN**
**ID:** 1
**Icone:** —
**Tags:** rede, VPN
**Descricao:** Artigos sobre redes corporativas.
**Artigos:** 5
| ID | Titulo |
|---|---|
| 101 | Como configurar VPN |
| 102 | Politica de Senhas |Errors:
404: Folder not found or not visible to the user. Without the "Gerenciar base de conhecimento" permission, only folders containing public articles or articles from the user's attendant groups are returned.
list_knowledge_folders
List knowledge base folders with optional search and pagination. Returns a Markdown table with ID, title, description (truncated), icon, article count, and tags.
Parameters:
search(string, optional): Search by folder title (case-insensitive).limit(number, optional): Results per page (default: 20, min: 1, max: 200). Values outside the range are clamped; a non-integer value ("abc","0x10",1.5, negative) is rejected with a validation error instead of being silently coerced.offset(number, optional): Page number, 1-based (default: 1, min: 1). Same strict validation aslimit.
Returns: Markdown table with columns ID | Titulo | Descricao | Icone | Qtd | Tags.
Example:
{ "search": "rede", "limit": 10 }Example response:
| ID | Titulo | Descricao | Icone | Qtd | Tags |
|---|---|---|---|---|---|
| 1 | Rede e VPN | Artigos sobre redes... | — | 5 | rede, VPN |create_knowledge
Create a new knowledge base article. Requires the "Gerenciar conhecimento" permission.
Note: The description field accepts Markdown (the MCP converts it to HTML before sending). HTML is also accepted (idempotent). Images must be embedded by URL:  — base64 and local files are not supported by the API.
Required fields:
title(string): Article title.description(string): Article body in Markdown or HTML. Example:"## Section\n\n- Step 1\n- Step 2".knowledge_folder_ids(array of numbers, min 1): IDs of the folders where the article will be published. Example:[12, 34].
Optional fields:
tags(array of strings): Tags for the article. Tags must not contain commas. Example:["VPN", "remote access"].private(boolean): Whether the article is private (default:true). Iffalse, the article is public.client_ids(array of numbers): Client IDs with access — only relevant whenprivate: true. Example:[100, 200].technical_group_ids(array of numbers): Technical group IDs with access — only relevant whenprivate: true. Example:[5, 10].services_catalogs_item_ids(array of numbers): Related service catalog item IDs. Example:[301, 302].
Returns: Confirmation with the created article's ID, title, visibility, folders, tags, and related IDs.
Example:
{
"title": "How to configure VPN",
"description": "<p>Step-by-step VPN setup guide for remote access.</p>",
"knowledge_folder_ids": [1, 2],
"tags": ["VPN", "remote access"],
"private": true,
"technical_group_ids": [5]
}Example response:
Conhecimento criado com sucesso!
**ID:** 201
**Titulo:** How to configure VPN
**Visibilidade:** Privado
**Pastas:** 1, 2
**Tags:** VPN, remote access
**Grupos tecnicos vinculados:** 5update_knowledge
Partially update an existing knowledge base article. Only the fields provided are sent — omitted fields remain unchanged. Requires the "Gerenciar conhecimento" permission.
Required fields:
knowledge_id(number): ID of the knowledge article to update (obtained fromlist_knowledgesorget_knowledge).
Optional fields (at least one must be provided):
title(string): New article title (max 255 chars; empty string rejected by API).description(string): New article body in Markdown or HTML. ⚠ Sending this field creates a new version — per the API contract, only the 10 latest versions are retained (retention is not observable through the public API). Empty string is rejected by the API (422).private(boolean): Iffalse, makes the article public and automatically clearsclient_idsandtechnical_group_ids. Do not send non-emptyclient_ids/technical_group_idstogether withprivate: false.tags(array of strings): Replaces current tags. Tags must not contain commas.client_ids(array of numbers): Replaces current client access list. Empty array removes all. Only applicable to private articles.technical_group_ids(array of numbers): Replaces current technical group access list. Empty array removes all. Only applicable to private articles.knowledge_folder_ids(array of numbers): Replaces current folder associations. Empty array is rejected by the API — the article must belong to at least one folder.services_catalogs_item_ids(array of numbers): Replaces current service catalog item associations. Empty array removes all.
Returns: Confirmation with the article ID, title, visibility, tags, and updated fields. Includes a notice when a new version was created or when private: false zeroed the access bindings.
Contract validated against the live API (2026-09-01, test org, disposable article created and archived): PUT /knowledges/{id} responds 200; all 8 updatable field names are accepted (an unknown field returns 400); a partial update sending only title preserves description; knowledge_folder_ids: [], title: "" and description: "" each return 422 can't be blank; private: false alone clears client_ids and technical_group_ids; private: false together with non-empty bindings returns 422 (the MCP guard pre-empts this); a non-existent ID returns 404. The 10-version retention is the only claim that could not be observed (there is no versions endpoint) and is therefore stated conditionally.
Example:
{
"knowledge_id": 4,
"title": "VPN Setup Guide (revised)",
"tags": ["VPN", "remote access", "updated"]
}Example response:
Conhecimento #4 atualizado com sucesso!
**ID:** 4
**Titulo:** VPN Setup Guide (revised)
**Visibilidade:** Privado
**Tags:** VPN, remote access, updated
**Campos alterados:** title, tagslist_contracts
List the organization's contracts (read-only). Returns a Markdown table with 9 columns: ID, name, client, contract type, modality, status (with (cancelado) suffix when applicable), expiration date, readjustment date, and total value.
Note: Only GET /contracts exists in the API v2 — there is no GET /contracts/{id} and no endpoint to list contract types. This means contract_type_ids filter IDs can only be discovered via include_details: true, which surfaces contract_type.id for each contract.
Permissions: The monetary fields (rider_tax, rider_value) are only available in the details block when using include_details: true, and only for users with the "Visualizar valores dos tickets" permission. Without it, the API returns "--" for those fields (rendered as-is). total_value is shown in the default table column.
Parameters (all optional):
include_details(boolean, defaultfalse): Whentrue, appends a detail block after the table with one line per contract showingclient.id(useful inclient_ids),contract_type.id(useful incontract_type_ids),duration,readjust_duration, andrider_value/rider_tax. Not sent to the API — rendering-only.client_ids(string, CSV): Filter by clients, IDs separated by commas (e.g."982,2,1024").contract_type_ids(string, CSV): Filter by contract types, IDs separated by commas (e.g."3,27").status(string, CSV): Filter by status —actives,readjust,expired, separated by commas (e.g."actives,expired"). By default the API lists onlyactives.limit(number, optional): Results per page (default: 20, max: 200).offset(number, optional): Page number (default: 1).
Returns: Markdown table with columns ID | Nome | Cliente | Tipo | Modalidade | Situação | Expiração | Reajuste | Valor total. Modality and status are translated to PT-BR (unknown enum values fall back to the raw API value). Dates are rendered as ISO YYYY-MM-DD. Monetary values are formatted as R$ 1.234,56 (with thousand separator). Status expired + cancelled: true renders as Inativo (cancelado). Total contract count from X-Total-Items header is shown in the pagination footer when available. With include_details: true, a **Detalhes** section follows the table.
Example:
{
"client_ids": "44",
"status": "actives,expired",
"include_details": true,
"limit": 10
}Example response:
| ID | Nome | Cliente | Tipo | Modalidade | Situação | Expiração | Reajuste | Valor total |
|---|---|---|---|---|---|---|---|---|
| 87508 | Contrato de licença de uso | 2V Sistemas | Contrato Tiflux | SaaS/Produto | Ativo | — | 2027-05-25 | R$ 974,30 |
| 103 | Contrato Expirado | Initech | Suporte | Horas | Inativo (cancelado) | 2024-12-31 | 2024-01-01 | R$ 28.963,20 |
**Detalhes**
- **#87508** · cliente ID 2274047 · tipo ID 178 · duracao: — · reajuste a cada 12 meses · adicional: R$ 974,30 (taxa R$ 0,00)list_equipments
List equipments/resources of the organization. Returns a Markdown table with ID, name, client, type, group, online status, and IP address for each resource. Optional blocks for manufacturer (manufacturer) and OS (system) info can be requested via flags — only populated for machines with the TiFlux agent installed.
Note: Agent-specific fields (online, ipv4, last_seen, agent) are only present for machines with the TiFlux agent. Manual resources (no agent) show — in those columns.
Permissions: Requires "Visualizar recursos" permission + Tickets License.
Parameters:
Parameter | Type | Required | Default | Description |
| number | no | — | Filter resources of a specific client (client ID) |
| boolean | no | false | Include manufacturer info (make, model, serial/asset tag). Only populated for agent-machines |
| boolean | no | false | Include OS info (name, version, kernel, timezone). Only populated for agent-machines |
| number | no | 20 | Results per page (max: 200) |
| number | no | 1 | Page number |
Returns: Markdown table ID | Nome | Cliente | Tipo | Grupo | Online | IP. When include_manufacturer/include_system are requested and present, additional sections are appended below the table. Pagination footer with total count when available.
Example:
{ "client_id": 724, "include_manufacturer": true, "limit": 50 }Typical flows:
"Machines of client X online?" →
list_equipmentswithclient_id→ filteronline."Manufacturer/asset tag of a machine?" →
list_equipmentswithinclude_manufacturer: true.
get_equipment
Get full details of a single equipment/resource by ID. Returns a comprehensive Markdown report including hardware inventory (processor, memory, disks, network adapters, sound, video, OS, manufacturer, antivirus, etc.), client, type, group, last contact date, acquisition/warranty dates (when set), and optional custom fields.
Note: The detail endpoint always includes hardware inventory when the TiFlux agent is installed — no extra flags needed. Fields like agent_email/agent_user may be null on some machines and populated on others. The network adapter ipv4 field is a comma-separated string that may contain multiple IPv4 and IPv6 addresses.
Inventory fields returned by the API (verified against real payloads on 2026-08-07): processor.name; memory.total_gb (number, GB); motherboard.{manufacturer,model,bios}; disks[].{name,size_gb,use_percent}; disksmart[].{model,status}; network[].{name,ipv4,mac}; printer[].{name,port,default}; sound[].name; vga[].{name,vram_mb}; operating_system.{name,version,kernel,service_pack} (kernel carries the architecture, e.g. "64 bits"); windows_update.{pending_count,has_critical_pending}; manufacturer.{name,model,serial}; antivirus[].{name,active,up_to_date}; plus current_user.
Permissions: Requires "Visualizar recursos" permission + Tickets License.
Parameters:
Parameter | Type | Required | Description |
| number | yes | Resource ID — use |
| boolean | no | Include custom fields (entities) linked to the resource (default: false) |
Returns: Full Markdown report with all available inventory sections. Sections for empty/null inventory blocks are omitted automatically.
Example:
{ "equipment_id": 385053 }{ "equipment_id": 385053, "show_entities": true }create_equipment
Create a new equipment/resource in TiFlux.
Permissions: Requires "Gerenciar recursos" permission + Tickets License.
Parameters:
Parameter | Type | Required | Description |
| string | yes | Resource name (max 255 chars) |
| number | yes | Client ID the resource belongs to |
| number | yes | Resource type ID — use |
| number | no | Resource group ID — use |
| string | no | Acquisition date (YYYY-MM-DD) |
| string | no | Warranty end date (YYYY-MM-DD; must be >= |
Returns: Confirmation text with resource ID, name, client, type, and group.
Example:
{
"name": "Notebook do João",
"client_id": 724,
"equipment_type_id": 1,
"equipment_group_id": 5,
"acquisition_date": "2024-03-15",
"warranty_date": "2027-03-15"
}Tip: Types and groups are organization-specific — run list_equipment_types and list_equipment_groups (with client_id) before creating to get the correct IDs.
update_equipment
Update an existing equipment/resource in TiFlux. Only provided fields are sent in the update.
Note: client_id cannot be changed via update — to change the client, create a new resource.
Permissions: Requires "Gerenciar recursos" permission + Tickets License.
Parameters:
Parameter | Type | Required | Description |
| number | yes | Resource ID to update |
| string | no | New name (max 255 chars) |
| number | no | New type ID |
| number | no | New group ID — must belong to the same client as the resource |
| string | no | New acquisition date (YYYY-MM-DD) |
| string | no | New warranty end date (YYYY-MM-DD; must be >= |
Returns: Confirmation text with resource ID, name, and updated fields.
list_equipment_softwares
List software installed on a resource (collected by the TiFlux agent). Returns a Markdown table with name, version, and vendor of each software.
Note: Only resources with the TiFlux agent installed have a software inventory. Manual resources (no agent) return an empty list — the response message clarifies this.
Permissions: Requires "Visualizar recursos" permission + Tickets License.
Parameters:
Parameter | Type | Required | Description |
| number | yes | Resource ID — use |
Returns: Markdown table Nome | Versao | Fabricante. Empty list message explains that inventory is only available for agent-machines.
Example:
{ "equipment_id": 11 }list_equipment_groups
List equipment/resource groups. Returns a Markdown table with ID, name, and client for each group.
Note: Groups are client-scoped — each client can have different groups. Use client_id to filter groups before creating a resource.
Permissions: Requires "Visualizar recursos" permission + Tickets License.
Parameters:
Parameter | Type | Required | Default | Description |
| number | no | — | Filter groups of a specific client — recommended when creating resources |
| number | no | 20 | Results per page (max: 200) |
| number | no | 1 | Page number |
Returns: Markdown table ID | Nome | Cliente with pagination footer.
Example:
{ "client_id": 724, "limit": 50 }list_equipment_types
List equipment/resource types of the organization. Returns a Markdown table with ID and name.
Note: Types are organization-specific. Common defaults: "Estação", "Hardware", "Software". Use this to get the correct equipment_type_id before creating a resource.
Permissions: Requires "Visualizar recursos" permission + Tickets License.
Parameters:
Parameter | Type | Required | Default | Description |
| string | no | — | Filter by name (partial, case-insensitive, max 255 chars). E.g. |
| number | no | 20 | Results per page (max: 200) |
| number | no | 1 | Page number |
Returns: Markdown table ID | Nome with pagination footer.
Example:
{ "name": "esta" }Pre-Ticket Tools
list_pre_tickets
List pre-tickets of the organization. Pre-tickets are service requests in a pre-triage stage — they carry requestor data, title, description, and optional client/equipment links, but have not yet been converted into tickets.
Permissions: Requires Tickets license + "Gerenciar pré-tickets" permission.
Parameters:
Parameter | Type | Required | Default | Description |
| boolean | no | false | If |
| number | no | — | Filter by client ID. Example: |
| string | no | — | Return pre-tickets created on or after this date (YYYY-MM-DD). Example: |
| string | no | — | Return pre-tickets created on or before this date (YYYY-MM-DD). Example: |
| boolean | no | false | If |
| number | no | 20 | Results per page (max: 200) |
| number | no | 1 | Page number |
Returns: Markdown table ID | Título | Cliente | Solicitante | Criado em with pagination footer. Empty list returns a message with guidance.
Example:
{ "client_id": 724, "created_after": "2026-07-01", "limit": 50 }create_pre_ticket
Create a new pre-ticket in TiFlux. Pre-tickets represent incoming service requests before they are assigned and triaged into formal tickets. Supports file attachments.
Permissions: Requires Tickets license + "Gerenciar pré-tickets" permission.
Parameters:
Parameter | Type | Required | Description |
| string | yes | Pre-ticket title |
| string | yes | Description/details of the request |
| string | yes | Requestor full name |
| string | yes | Requestor e-mail address |
| string | yes | Requestor telephone number |
| number | no | Requestor extension (ramal) |
| string | no | Requestor country (ISO 2-letter code). Example: |
| number | no | Client ID to associate with the pre-ticket. Example: |
| array | no | Attachments. Each item: |
Returns: Confirmation text with pre-ticket ID, title, client, and requestor info.
Example (minimal):
{
"title": "Sistema fora do ar",
"description": "Não consigo acessar o sistema desde as 8h.",
"requestor_name": "João Silva",
"requestor_email": "joao.silva@empresa.com",
"requestor_telephone": "11999990001"
}Example (with client and attachment):
{
"title": "Erro na impressão",
"description": "A impressora da recepção não imprime documentos PDF.",
"requestor_name": "Maria Souza",
"requestor_email": "maria.souza@empresa.com",
"requestor_telephone": "11999990002",
"client_id": 724,
"files": [{ "content": "<base64>", "filename": "screenshot.png" }]
}list_gupshup_templates
List HSM templates from the Gupshup WhatsApp integration available in the organization. Returns the name, approval status, category, content (with variables like {{1}}), description, and integration ID of each template. Use to discover the approved template IDs and names that feed send_message (origin: gupshup).
Permissions: Requires "Gerenciar Modelos" permission.
Parameters:
Parameter | Type | Required | Default | Description |
| number | no | — | Filter by Gupshup integration ID. Example: |
| number | no | 1 | Page number |
| number | no | 20 | Results per page (max 200) |
Returns: Compact list — one line per template with name, status, category, integration ID, and a short preview (~70 chars) of the HSM content (variables like {{1}} preserved). The one-line format keeps the payload bounded even on a full 200-item page. To read a template's full content, narrow the list (e.g. by integration_id) and use a small page.
**Templates Gupshup (200)**
- **first_contact_with_org** (ID 15174) · APPROVED · UTILITY · int 1867 — _Olá, tudo bem? aqui é o {{1}} da {{2}}. Podemos conversar sobre o seu…_
- **hsm_template** (ID 1) · APPROVED · ALERT_UPDATE · int 1 — _You are in department {{1}}_Example:
{
"integration_id": 2,
"limit": 20
}list_whatsapp_cloud_templates
List templates from the WhatsApp Cloud (Meta) integration available in the organization. Returns name, approval status, language, category, Meta template ID, and a short preview of the body text. Use to discover templates that feed send_message (origin: whatsapp_cloud). Filter by status: "APPROVED" to see only templates ready to use.
Permissions: Requires "Gerenciar Modelos" permission.
Parameters:
Parameter | Type | Required | Default | Description |
| number | no | — | Filter by WhatsApp Cloud integration ID. Example: |
| string | no | — | Filter by template status: |
| number | no | 1 | Page number |
| number | no | 20 | Results per page (max 200) |
Returns: Compact list — one line per template with name, status, language, category, Meta template ID, and a short preview (~70 chars) of the body text. header/footer are omitted from the list row to keep it scannable and the payload bounded on full pages.
**Templates WhatsApp Cloud (2)**
- **integracao_teste** (ID 1) · APPROVED · pt_BR · CATEGORY · tpl `bvwzyawdpyrtibavxvnrzcvswxqbltst` — _teste idioma_Example:
{
"status": "APPROVED",
"limit": 50
}list_entities
List custom field groups (entities) available in the Tiflux organization. Use to discover which custom field groups exist, which applications they apply to (ticket, client, etc.), and their IDs — required for list_entity_fields.
Parameters:
Parameter | Type | Required | Default | Description |
| boolean | no | — | Filter active ( |
| string | no | — | Filter by application: |
| string | no | — | Filter by entity name (partial match) |
| number | no | 20 | Results per page (max: 200) |
| number | no | 1 | Page number |
Returns: Markdown table with id, name, applied_in, active.
Example:
{
"applied_in": "ticket"
}Example response:
| ID | Nome | Applied In | Ativa |
|---|---|---|---|
| 10 | Classificação do Chamado | ticket | Sim |
| 11 | Dados do Atendimento | ticket | Sim |list_entity_fields
List subfields (entity_fields) of a custom field group in Tiflux. Returns name, type, required status, and indicates which fields have selectable options (single_select/checkbox) — use list_entity_field_options in those cases.
Parameters:
Parameter | Type | Required | Default | Description |
| number | yes | — | ID of the custom field group (entity). Obtain via |
| string | no | — | Filter by type: |
| boolean | no | — | Filter required ( |
| string | no | — | Filter by field name |
| number | no | 20 | Results per page (max: 200) |
| number | no | 1 | Page number |
Returns: Markdown table with id, name, field_type, required, and options hint for single_select/checkbox fields.
Example:
{
"entity_id": 10,
"field_type": "checkbox"
}Example response:
| ID | Nome | Tipo | Obrigatorio | Opcoes |
|---|---|---|---|---|
| 81 | Categoria do Impacto | checkbox | Nao | Sim (use list_entity_field_options) |list_entity_field_options
List options of a custom subfield (entity_field) of type single_select or checkbox. Use to get option IDs (entity_field_option_id) required when filling multiple-choice fields via update_ticket_entities.
Parameters:
Parameter | Type | Required | Default | Description |
| number | yes | — | ID of the subfield (entity_field). Obtain via |
| string | no | — | Filter options by value/text (partial match) |
| number | no | 20 | Results per page (max: 200) |
| number | no | 1 | Page number |
Returns: Markdown table with option id, value, null_option.
Example:
{
"entity_field_id": 81
}Example response:
| ID | Valor | Opcao nula |
|---|---|---|
| 11 | Hardware | Nao |
| 12 | Software | Nao |
| 13 | Rede | Nao |
| 14 | (nenhuma) | Sim |Search Heuristics — Mesa-First
When a user references a name without explicitly qualifying the entity type, the following priority applies:
User input | Filter to use | Reason |
"tickets do tuitui" (unqualified name) |
| Unqualified term = desk/team in most cases |
"tickets da mesa X" / "equipe Y" |
| "mesa" / "equipe" = desk |
"tickets do cliente Z" / "empresa ACME" |
| "cliente" / "empresa" = company |
"tickets do João" (person name) |
| Person = requestor |
"tickets atribuídos ao João" |
| "atribuído a" = responsible — |
"tickets aberto por joao@empresa.com" |
| Email = requestor |
Ambiguous / uncertain | Ask the user | Visible failure > filtering by wrong entity |
(create_ticket) "solicitante Fulano" |
| Avoids ghost requestor duplicate |
This heuristic is embedded in the description fields of list_tickets, create_ticket, and update_ticket schemas. The LLM reads these on every tool call decision.
Smart Name Resolution
When using desk_name in any tool, the MCP server performs a two-step lookup:
Direct search:
GET /desks?active=true&name={desk_name}— fast, uses the API's built-in filter.Fuzzy fallback (automatic): If the direct search returns no results, the server fetches all active desks (paginated, up to 200 per page) and applies client-side fuzzy matching with tokenization and normalization (trim, lowercase, accent-insensitive). Works correctly regardless of how many desks the organization has. This handles common patterns like:
Partial name:
"cansados"resolves to"Dev - Cansados"Accent-insensitive:
"comunicacao"resolves to"Comunicação"Token match:
"premium"resolves to"Dev - Premium"Multi-word (tokens in any order, separator-insensitive):
"dev experimentos"resolves to"DEV - Experimentos"
The fallback returns only the highest-scoring group of matches — so single-match terms resolve immediately, while ambiguous terms (multiple desks at equal score) return a disambiguation list.
Behavior:
If exactly 1 desk matches → auto-resolved, request proceeds normally.
If multiple desks match at the same score → returns a list so you can be more specific or use
desk_iddirectly.If no match → returns a clear error message.
This applies to: create_ticket, update_ticket, list_tickets, search_stage, search_catalog_item, get_desk, list_desk_priorities, and list_desk_services_catalogs.
Appointment valorization resolution (create_appointment): three additional name parameters resolve valorization IDs scoped to the ticket itself — no cross-organization ambiguity:
shift_name→ resolves toshift_id(fuzzy match over available travel shifts for the ticket)loose_service_name→ resolves toloose_service_id(fuzzy match over available loose services)contract_name→ resolves tocontract_rider_id(fuzzy match overcontract_riders[].contract.name— returns the rider ID, not the contract ID)
All three apply the same 0/1/N behavior: 0 matches → error with suggestion to use the corresponding get_ticket_* tool; 1 match → resolved; N matches → disambiguation list with IDs. When both the ID field and the name field are given, the ID takes precedence.
Services catalog resolution (all *_services_catalog* and *_services_catalog_item* tools): two additional name parameters resolve catalog and area IDs server-side using the API's built-in ilike filter (no client-side fuzzy):
services_catalog_name→ resolves toservices_catalog_idviaGET /services-catalogs?name={value}&limit=50area_name→ resolves toservices_catalogs_area_idviaGET /services-catalogs/{catalog_id}/areas?name={value}&limit=50
Both apply the same 0/1/N behavior: 0 matches → error; 1 match → resolved; N matches → disambiguation list with IDs. When both the ID field and the name field are given, the ID takes precedence.
get_billings_history
Returns the organization's billing history. Filters are all optional: billing period (billing_start_date + billing_end_date, mandatory in pair), due date period (due_start_date + due_end_date, mandatory in pair), client by ID (client_id) or name with fuzzy resolver (client_name), NFe number (nfe_number), ticket number (ticket_number), and billing status (type). The response is a 7-column table plus a page sum.
Permissions: Requires "Faturar serviços avulsos e contratos" + Tickets license. Returns 403 for users without billing permission.
Parameters:
Parameter | Type | Required | Default | Description |
| string | no (pair) | — | Start of billing period ( |
| string | no (pair) | — | End of billing period ( |
| string | no (pair) | — | Start of due date period ( |
| string | no (pair) | — | End of due date period ( |
| number | no | — | Filter by client ID. Takes precedence over |
| string | no | — | Client name (partial or exact) for fuzzy auto-resolution. Ignored when |
| number | no | — | Filter by NFe number. |
| number | no | — | Filter by ticket number associated with the billing. |
| string | no | — | Billing status: |
| number | no | 1 | Page number. |
| number | no | 20 | Results per page (max 200). |
Returns: Markdown table with 7 columns — ID, Cliente, Data faturamento, Vencimento, NFe, Situação, Valor — plus a page sum row (Soma desta página (sem estornos)) and pagination footer. Situação is derived: reversal=true → Estornado; paid=true → Pago; both false → Faturado. Monetary values formatted as R$ X.XXX,XX.
Page sum semantics:
Soma desta página (sem estornos)adds upreal_valuefor the rows on the current page excluding reversed billings (reversal=true). A reversal is an in-placeUPDATEon the billing record — the API returns itsreal_valueas a positive number and there is no offsetting entry, so summing it would inflate the total and subtracting it would double-count (the reversed work can later be re-billed under a newbilling_id). The product convention (internal report and native screen) is to filter, not subtract. When the page contains reversals, a note lists how many were excluded and their summed value. Note:type: "paid"does not exclude reversals (it filters by financial-integration status only) — usetype: "billed"for a set with no reversals. The endpoint returns no monetary total for the filter, only the record count via theX-Total-Itemsheader.
Example:
{
"billing_start_date": "2024-10-01",
"billing_end_date": "2024-10-31",
"type": "billed"
}Example response:
**Faturamentos (1)**
| ID | Cliente | Data faturamento | Vencimento | NFe | Situação | Valor |
|---|---|---|---|---|---|---|
| 2 | Zemlak-Cremin | 2024-10-10 | 2024-10-15 | 4310034 | Faturado | R$ 755,90 |
**Soma desta página (sem estornos):** R$ 755,90Services Catalogs Tools
Manage the three-level catalog hierarchy: catalog → area → item. Catalogs and areas are containers; items are the SLA-bearing leaves that can be selected when creating tickets. All write operations require the service_catalogs_manage role ("Gerenciar catálogos de serviço").
No
get_*shortcut exists. The API does not exposeGET /services-catalogs/{id},GET /services-catalogs-areas/{id}, orGET /services-catalogs-areas/{id}/items/{id}. To retrieve details of a specific catalog, area, or item, use the correspondinglist_*tool with thenamefilter.
Smart name resolution:
services_catalog_nameandarea_nameare resolved server-side (APIilikefilter, no fuzzy fallback). See Smart Name Resolution.
list_services_catalogs
List all service catalogs in the organization (org-wide configuration view). Use the name filter to locate a specific catalog.
Different from list_desk_services_catalogs (catalogs linked to one desk) and search_catalog_item (items selectable in tickets of a desk).
Parameters:
Parameter | Type | Required | Default | Description |
| string | no | — | Filter by name (partial, case/accent-insensitive, server-side) |
| number | no | 1 | Page number |
| number | no | 20 | Results per page (max 200) |
Returns: List of catalogs with id and name. Header X-Total-Items for total count.
Example:
{ "name": "Infra" }create_services_catalog
Create a new service catalog. The name must be unique across the organization (uniqueness validated only on create).
Permissions: Requires service_catalogs_manage.
Parameters:
Parameter | Type | Required | Default | Description |
| string | yes | — | Catalog name (unique org-wide) |
Returns: Created catalog with id and name.
Example:
{ "name": "Infraestrutura" }update_services_catalog
Update the name of an existing service catalog.
Permissions: Requires service_catalogs_manage. Note: uniqueness is validated only on create — the update accepts duplicate names without error (API v2 behavior).
Parameters:
Parameter | Type | Required | Default | Description |
| number | yes | — | Catalog ID |
| string | yes | — | New catalog name |
Example:
{ "id": 5, "name": "Infraestrutura TI" }delete_services_catalog
Remove (soft delete) a service catalog and all its areas and items in cascade.
Permissions: Requires service_catalogs_manage.
Warning: The deletion cascade silently deactivates all areas, items, and recurring activities that reference those items — including items currently in use by tickets. The pre-flight count is informational only, not a gate: it runs before the DELETE (afterwards the records are already inactive and no longer countable) and its result is only appended to the success message. There is no confirm / dry_run parameter — the DELETE always proceeds, even if the pre-flight fails.
Parameters:
Parameter | Type | Required | Default | Description |
| number | yes | — | Catalog ID to delete |
Example:
{ "id": 5 }list_services_catalog_areas
List active areas belonging to a service catalog. Use services_catalog_id (direct) or services_catalog_name (auto-resolved). Use the name filter to locate a specific area.
Parameters:
Parameter | Type | Required | Default | Description |
| number | one of | — | Catalog ID (takes precedence over |
| string | one of | — | Catalog name for auto-resolution |
| string | no | — | Filter areas by name (partial, server-side) |
| number | no | 1 | Page number |
| number | no | 20 | Results per page (max 200) |
Returns: List of areas with id, name, and parent catalog name.
Example:
{ "services_catalog_name": "Infraestrutura", "name": "Redes" }create_services_catalog_area
Create a new area inside a service catalog.
Permissions: Requires service_catalogs_manage.
Parameters:
Parameter | Type | Required | Default | Description |
| number | one of | — | Catalog ID (takes precedence over |
| string | one of | — | Catalog name for auto-resolution |
| string | yes | — | Area name (unique per catalog) |
Example:
{ "services_catalog_name": "Infraestrutura", "name": "Servidores" }update_services_catalog_area
Update the name of an area inside a service catalog.
Permissions: Requires service_catalogs_manage.
Parameters:
Parameter | Type | Required | Default | Description |
| number | one of | — | Catalog ID (takes precedence over |
| string | one of | — | Catalog name for auto-resolution |
| number | yes | — | Area ID |
| string | yes | — | New area name |
Example:
{ "services_catalog_id": 1, "id": 10, "name": "Servidores Linux" }delete_services_catalog_area
Remove (soft delete) an area and all its items in cascade.
Permissions: Requires service_catalogs_manage.
Warning: All items in the area are deactivated. The pre-flight count is informational only, not a gate — it runs before the DELETE just to report the number of affected items; there is no confirmation step and the DELETE always proceeds.
Parameters:
Parameter | Type | Required | Default | Description |
| number | one of | — | Catalog ID (takes precedence over |
| string | one of | — | Catalog name for auto-resolution |
| number | yes | — | Area ID to delete |
Example:
{ "services_catalog_id": 1, "id": 10 }list_services_catalog_items
List active items in a service catalog area. Use services_catalogs_area_id (direct) or the combination area_name + services_catalog_id/services_catalog_name.
Different from search_catalog_item which is desk-scoped (items selectable in tickets of a specific desk).
Parameters:
Parameter | Type | Required | Default | Description |
| number | one of | — | Area ID (takes precedence over |
| string | one of | — | Area name for auto-resolution (requires catalog id or name) |
| number | — | — | Catalog ID (used in area resolution; takes precedence over |
| string | — | — | Catalog name for auto-resolution |
| string | no | — | Filter items by name (partial, server-side) |
| number | no | 1 | Page number |
| number | no | 20 | Results per page (max 200) |
Returns: List of items with id, name, parent area/catalog names, start_time (SLA atendimento), end_time (SLA solução).
Example:
{ "area_name": "Redes", "services_catalog_name": "Infraestrutura" }create_services_catalog_item
Create a new item in a service catalog area.
Permissions: Requires service_catalogs_manage.
SLA fields: start_time = attendance deadline (SLA de atendimento); end_time = solution deadline (SLA de solução). Format "HH:MM" with hours 0–999 (e.g. "120:30" = 120 h 30 min). end_time must be >= start_time. Both fields are required by the API (the Swagger declares required: [] but the model enforces them).
Parameters:
Parameter | Type | Required | Default | Description |
| number | one of | — | Area ID (takes precedence over |
| string | one of | — | Area name for auto-resolution |
| number | — | — | Catalog ID (used in area resolution) |
| string | — | — | Catalog name for auto-resolution |
| string | yes | — | Item name |
| string | yes | — | SLA de atendimento ( |
| string | yes | — | SLA de solução ( |
Example:
{
"services_catalogs_area_id": 10,
"name": "Troca de Switch",
"start_time": "08:00",
"end_time": "24:00"
}update_services_catalog_item
Update an item in a service catalog area (partial update — only provided fields are sent).
Permissions: Requires service_catalogs_manage.
At least one of name, start_time, or end_time must be provided. SLA format and end_time >= start_time constraint apply when both time fields are supplied.
Parameters:
Parameter | Type | Required | Default | Description |
| number | one of | — | Area ID (takes precedence over |
| string | one of | — | Area name for auto-resolution |
| number | — | — | Catalog ID (used in area resolution) |
| string | — | — | Catalog name for auto-resolution |
| number | yes | — | Item ID |
| string | no | — | New item name |
| string | no | — | New SLA de atendimento ( |
| string | no | — | New SLA de solução ( |
Example:
{ "services_catalogs_area_id": 10, "id": 50, "end_time": "48:00" }delete_services_catalog_item
Remove (soft delete) a service catalog item. No cascade — items are leaf nodes.
Permissions: Requires service_catalogs_manage.
Warning: An item in use by tickets is silently deactivated (no blocking, no confirmation prompt). There is no pre-flight count for items.
Parameters:
Parameter | Type | Required | Default | Description |
| number | one of | — | Area ID (takes precedence over |
| string | one of | — | Area name for auto-resolution |
| number | — | — | Catalog ID (used in area resolution) |
| string | — | — | Catalog name for auto-resolution |
| number | yes | — | Item ID to delete |
Example:
{ "services_catalogs_area_id": 10, "id": 50 }API Endpoints Used
The MCP server integrates with the following Tiflux API v2 endpoints:
GET /tickets/{id}- Retrieve ticket detailsPOST /tickets- Create new tickets (supports multipart with file attachments viafiles_base64;requestor_idbody field links existing requestor)PUT /tickets/{id}- Update existing tickets (supportsrequestor_idto change the ticket's requestor;followersreplaces the full list)PUT /tickets/{id}/entities- Update ticket custom fieldsPUT /tickets/{ticket_number}/cancel- Cancel specific ticketPUT /tickets/{ticket_number}/close- Close specific ticketPUT /tickets/{ticket_number}/reopen- Reopen closed or canceled ticket (supports optionaldisapproval_reason)POST /tickets/{ticket_number}/answers- Create ticket answer (client communication)GET /tickets/{ticket_number}/answers- List ticket answers (client communications), paginatedGET /tickets/{ticket_number}/answers/{id}- Get specific ticket answer with attached filesDELETE /tickets/{ticket_number}/answers/{id}- Remove a ticket answer (delete_ticket_answer)DELETE /ticket_answers/{ticket_answer_id}/files/{id}- Remove a file from a ticket answer (delete_ticket_answer_file)GET /tickets/{ticket_number}/histories- Get ticket event history (timeline) with optional filtersGET /tickets- List tickets with filters (supportsrequestor_ids,requestor_email,services_catalogs_item_ids,priority_idsquery params; response includesservices_catalogandpriorityper ticket). Also supportsgroup_by(values: day/week/month/desk) for aggregated counts — returns{ group_by, date_type, total, buckets: [{period, count}] }instead of a ticket list. Note:group_byand the aggregated response shape are not documented in the public Swagger as of 2026-06-30; the feature was added in api_rails ticket #96694 and is live in production. Used internally byget_tickets_comparison(2 calls per invocation) andlist_tickets(withgroup_byparam). A documentation request has been registered with the API team.GET /clients- Search/list clients (search_client,list_clients, andclient_nameauto-resolve inlist_ticketsandcreate_ticket)GET /clients/{id}- Get client details (get_client)POST /clients- Create a new client (create_client)PUT /clients/{id}- Update client fields (update_client)PUT /clients/{id}/entities- Update client custom fields (update_client_entities)GET /clients/{id}/desks- List desks associated with a client (get_client_desks)GET /clients/{id}/technical-groups- List technical groups associated with a client (get_client_technical_groups)POST /clients/{id}/users- Create a portal user for a client (create_client_user)POST /clients/{id}/email_tickets_permissions- Add authorized email/domain for a client (add_client_email_permission)GET /clients/{client_id}/addresses- List addresses of a client (list_client_addresses)POST /clients/{client_id}/addresses- Create an address for a client (create_client_address)GET /clients/{client_id}/addresses/{id}- Get a specific address of a client (get_client_address)PUT /clients/{client_id}/addresses/{id}- Update an address of a client (update_client_address)DELETE /clients/{client_id}/addresses/{id}- Remove an address from a client (delete_client_address)GET /clients/{client_id}/contacts- List contacts of a client (list_client_contacts)POST /clients/{client_id}/contacts- Create a contact for a client (create_client_contact)GET /clients/{client_id}/contacts/{id}- Get a specific contact of a client (get_client_contact)PUT /clients/{client_id}/contacts/{id}- Update a contact of a client (update_client_contact)DELETE /clients/{client_id}/contacts/{id}- Remove a contact from a client (delete_client_contact)GET /requestors- Search requestors with server-side filtering (search_requestor, andrequestor_name/requestor_emailauto-resolve increate_ticketandupdate_ticket). Used as fallback when the client-scoped route returns 403 or when noclient_idis available.GET /clients/{client_id}/requestors- Client-scoped requestor listing/search. Powerslist_requestors. Primary route forrequestor_name/requestor_emailauto-resolve increate_ticketandupdate_ticketwhenclient_idis known (scoped-first since v2.37.0, eliminates ticket #98515 class of bug). Falls back to globalGET /requestorson 403.GET /clients/{client_id}/requestors/{id}- Get a single requestor of a client (get_requestor;include_entity_fieldsfor custom fields).POST /clients/{client_id}/requestors- Create a requestor in a client (create_requestor).PUT /clients/{client_id}/requestors/{id}- Update a requestor (update_requestor, partial).PUT /clients/{client_id}/requestors/{id}/entities- Update a requestor's custom fields (update_requestor_entities).DELETE /clients/{client_id}/requestors/{id}- Delete a requestor (mapped; not yet implemented as an MCP tool — out of current scope).POST /users- Create a new user/agent (create_user). Admin-only — returns 403 for non-admin keys.GET /users/{id}- Get user details (get_user). Admin-only.PUT /users/{id}- Update user fields (update_user, partial). Admin-only.GET /users- Search users (used bysearch_user,responsible_nameauto-resolve, and as level 3 of thesearch_requestorfallback chain — the matched user's email becomesrequestor_email). Returns 403 for non-admin users — handled automatically by the fallback below.GET /users/me- Current authenticated user (used as the final level of thesearch_requestorchain — suggests opening the ticket as yourself viarequestor_email).GET /technical-users- Search technical attendants with server-side filtering by name, email, desk_id, client_id (search_technical_user). Does not require user management permission — works for admin and non-admin. Primary path forresponsible_nameauto-resolve increate_ticket,update_ticket,list_tickets. Note: absent from the public swagger.json as of 2026-06-18 but live in production.GET /technical-groups- List attendant groups (used bysearch_usernon-admin fallback and as fallback forresponsible_nameresolution when/technical-usersreturns 404/403)GET /technical-groups/{id}/users- List users in an attendant group (non-admin fallback forsearch_user— deduplicated, fuzzy-matched)GET /departments- List organization departments with optional name search (list_departments). Admin: all active; non-admin: only linked to attendant groupGET /desks- Search/list desks (used by Smart Name Resolution andlist_desks)GET /desks/{id}- Get full desk configuration (get_desk)GET /desks/{id}/priorities- Get desk priorities (list_desk_priorities,update_ticketpriority_name resolution,list_ticketspriority_name resolution)GET /desks/{id}/services-catalogs- Get desk service catalogs (list_desk_services_catalogs)GET /desks/{id}/stages- Get desk stagesGET /desks/{id}/services-catalogs-items- Get service catalog items (supports?namefor server-side search by catalog/area/item name; used bysearch_catalog_itemandlist_ticketscatalog_queryresolver)POST /tickets/{ticket_number}/internal_communications- Create internal communicationGET /tickets/{ticket_number}/internal_communications- List internal communicationsGET /tickets/{ticket_number}/internal_communications/{id}- Get specific internal communicationPUT /tickets/{ticket_number}/internal_communications/{id}- Update internal communication text (update_internal_communication)DELETE /tickets/{ticket_number}/internal_communications/{id}- Remove an internal communication (delete_internal_communication)GET /tickets/{ticket_number}/files- Get ticket attached filesPOST /tickets/{ticket_number}/files- Upload files to an existing ticket (upload_ticket_files)DELETE /tickets/{ticket_number}/files/{id}- Remove a file attached to a ticket (delete_ticket_file)GET /tickets/{ticket_number}/stages-slas- Get ticket stages history with SLA outcomesGET /tickets/{ticket_number}/service-types- List service types available for valorization of a ticket appointment (contract riders and loose services). Used byget_ticket_service_typesand bycreate_appointmentforloose_service_name/contract_nameresolution.GET /tickets/{ticket_number}/shifts- List displacements available for valorization of a ticket appointment (travel/visit costs, filterable by contract_id). Used byget_ticket_shiftsand bycreate_appointmentforshift_nameresolution.GET /tickets/{ticket_number}/checklists- List checklists (forms) of a ticket with all fields and fill state (get_ticket_checklists; paginated viaoffset/limit; headerX-Total-Itemsfor total count)PUT /tickets/{ticket_number}/checklists/{id}/items/{index}- Fill or clear a single checklist field (update_ticket_checklist_item; payload:{ value }for text/textarea/value/radio or{ options: [{id, checked}] }for checkbox;{ value: null }clears any field)POST /tickets/{ticket_number}/appointments- Create a ticket appointment. Supports 9 valorization fields:attendance(1/2/3),attendance_kind(1/2),contract_rider_id,loose_service_id,shift_id,shift_owner_ticket_number,guarantee,value,external_user_name. Plus 3 name-resolution params:shift_name,loose_service_name,contract_name.GET /appointments- List global appointments across all tickets with server-side filters (user_ids, desk_ids, client_ids, contract_ids, start_date, end_date, include_valorization); returns X-Total-Items header. Response includesexternal_user_name,valorization.shift_owner_ticket, andcontractat the item top level (view :global). Used bylist_appointments_globalandlist_appointments_report.GET /tickets/{ticket_number}/appointments- List ticket appointments with filters; returns X-Total-Items header. Response includesexternal_user_nameandvalorization.shift_owner_ticket. Used bylist_appointments.GET /tickets/{ticket_number}/pre-appointments- List open (in-progress) time records for a ticket; returns X-Total-Items header. Requires "Criar e editar apontamentos" permission and Tickets license. Used bylist_pre_appointments.GET /chats/{id}- Retrieve chat details.originis an object{ integration_id, _type, fields }; displayed as_type.assumed_atsynthesized for legacy chats (may differ from listing)GET /chats/inbox- List inbox chats.originobject →_type;assumed_atalways null (unassumed chats)GET /chats/mine- List chats assigned to the authenticated user.originobject →_type;assumed_atraw columnGET /chats/in_attendance- List chats currently in attendance.originobject →_type;assumed_atraw columnGET /chats/archived- List archived (finished or canceled) chats.originobject →_type;assumed_atraw columnGET /chats/{id}/messages- List messages of a chat in chronological order (list_chat_messages)PUT /chats/{id}- Update a chat (transfer attendant/department, link ticket)POST /chats/send_message- Send a WhatsApp message (free text or HSM template), creating the chatPUT /chats/{id}/archive- Finish (archive) a chatGET /entities- List custom field groups (list_entities)GET /entities/{entity_id}/fields- List custom subfields of an entity (list_entity_fields)GET /entity_fields/{entity_field_id}/options- List options of a single_select/checkbox field (list_entity_field_options)GET /knowledges- List knowledge base articles with optional search/folder filter (list_knowledges). Without "Gerenciar base de conhecimento" permission: public + attendant group only; with permission: allGET /knowledges/{id}- Fetch full detail of a knowledge article by ID (get_knowledge). Returnsdescriptionconverted from HTML to MarkdownPOST /knowledges- Create a new knowledge base article (create_knowledge). Accepts Markdown indescription(converted to HTML before sending). Requires "Gerenciar conhecimento" permissionPUT /knowledges/{id}- Partially update an existing knowledge base article (update_knowledge). Only fields provided are sent. Sendingdescriptioncreates a new version. Requires "Gerenciar conhecimento" permission. Note: absent from the public Swagger snapshot as of 2026-09-01; the contract (verb, field names, partial-update and validation semantics) was confirmed empirically against the live API on 2026-09-01. A documentation request has been registered with the API teamDELETE /knowledges/{id}- Archive (soft-delete) a knowledge base article (delete_knowledge). Setsarchived: trueand unlinks from all folders. Irreversible. Requires "Gerenciar conhecimento" permissionGET /knowledge-folders/{id}- Fetch full detail of a knowledge folder by ID (get_knowledge_folder). Returns title, description, icon, tags, total article count, and list of visible articlesGET /knowledge-folders- List knowledge base folders (list_knowledge_folders)GET /contracts- List the organization's contracts (list_contracts), read-only. Returns 14 fields per contract; secondary fields (IDs,rider_value/rider_tax, durations) exposed viainclude_details: true. HeaderX-Total-Itemsfor total count. NoGET /contracts/{id}exists in the API; no endpoint to list contract types (IDs discoverable only viainclude_details). Monetary fields require "Visualizar valores dos tickets" permission (otherwise"--").GET /reports/feedbacks/chats- Chats satisfaction/feedback report (get_chats_feedback_report). Returnssummary(rating_average, chats_evaluated, chats_finished, clients_evaluated, answers_percentage); optionalchats_listwithchats_list=true. Requires administrator/reports permission (403 for non-admin).GET /reports/feedbacks/tickets- Tickets satisfaction/feedback report (get_tickets_feedback_report). Same structure as chats; list items usetickets_list=true,rating(integer),revised_in_time(timestamp),comments(plural, may be""),desk_id/desk_name. Requires administrator/reports permission (403 for non-admin).GET /reports/billings/history- Billing history report (get_billings_history). Returns paginated array of billing records withbilling_id,billing_date,client_id,client_name,due_date,nfe_number,paid,real_value,reversal. Filters:billing_start_date/billing_end_date(pair),due_start_date/due_end_date(pair),client_id,nfe_number,ticket_number,_type(billed|reversed|paid). HeaderX-Total-Itemsfor total count. Requires "Faturar serviços avulsos e contratos" permission + Tickets license (403 code40301without permission,40304without license).GET /equipments- List equipment/resources with optional filters (list_equipments). Supportsclient_id,include_manufacturer,include_systemflags, pagination. Requires "Visualizar recursos" + Tickets License.GET /equipments/{id}- Get full details of a single equipment/resource (get_equipment). Returns hardware inventory, OS, manufacturer, network, custom fields (optional). Requires "Visualizar recursos" + Tickets License.POST /equipments- Create a new equipment/resource (create_equipment). Required:name,client_id,equipment_type_id. Optional:equipment_group_id(auto-assigned if omitted),acquisition_date,warranty_date.PUT /equipments/{id}- Update an existing equipment/resource (update_equipment). Partial update — only provided fields are sent.GET /equipments/{id}/softwares- List installed software on a resource (list_equipment_softwares). No pagination params — endpoint returns all at once.GET /equipment-groups- List equipment groups with optionalclient_idfilter (list_equipment_groups). Paginated withX-Total-Items.GET /equipment-types- List equipment types with optionalnamefilter (partial, case-insensitive) (list_equipment_types). Paginated withX-Total-Items.GET /pre-tickets- List pre-tickets (service requests in pre-triage) with optional filters (list_pre_tickets). Supportsarchived,client_id,created_after,created_before,include_description, pagination. HeaderX-Total-Itemsfor total count. Requires Tickets license + "Gerenciar pré-tickets" permission.POST /pre-tickets- Create a new pre-ticket (create_pre_ticket).multipart/form-data. Required:title,description,requestor_name,requestor_email,requestor_telephone. Optional:requestor_ramal,requestor_country,client_id,files[](max 10, 25MB each).GET /templates/gupshup- List HSM templates from the Gupshup integration (list_gupshup_templates). Filters:integration_id,offset,limit. HeaderX-Total-Itemsfor total count. Requires "Gerenciar Modelos" permission.GET /templates/whatsapp_cloud- List templates from the WhatsApp Cloud (Meta) integration (list_whatsapp_cloud_templates). Filters:integration_id,status(enum: APPROVED/MISSING_VARS/REJECTED/PENDING),offset,limit. HeaderX-Total-Itemsfor total count. Requires "Gerenciar Modelos" permission.GET /services-catalogs- List org-wide service catalogs (list_services_catalogs). Filter byname(ilike). HeaderX-Total-Items. Requiresservice_catalogs_managerole for write operations (read is unrestricted).POST /services-catalogs- Create a service catalog (create_services_catalog). Body{ services_catalog: { name } }. Name must be unique. Requiresservice_catalogs_manage.PUT /services-catalogs/{id}- Update a service catalog name (update_services_catalog). Body{ services_catalog: { name } }. Requiresservice_catalogs_manage.DELETE /services-catalogs/{id}- Soft-delete a service catalog and cascade-deactivate its areas and items (delete_services_catalog). Returns 204. Requiresservice_catalogs_manage.GET /services-catalogs/{id}/areas- List areas of a catalog (list_services_catalog_areas). Filter byname. HeaderX-Total-Items.POST /services-catalogs/{id}/areas- Create an area in a catalog (create_services_catalog_area). Body{ area: { name } }. Requiresservice_catalogs_manage.PUT /services-catalogs/{catalog_id}/areas/{id}- Update an area name (update_services_catalog_area). Body{ area: { name } }. Requiresservice_catalogs_manage.DELETE /services-catalogs/{catalog_id}/areas/{id}- Soft-delete an area and cascade-deactivate its items (delete_services_catalog_area). Returns 204. Requiresservice_catalogs_manage.GET /services-catalogs-areas/{id}/items- List items of an area (list_services_catalog_items). Filter byname. HeaderX-Total-Items.POST /services-catalogs-areas/{id}/items- Create an item in an area (create_services_catalog_item). Body{ item: { name, start_time, end_time } }.start_time/end_timeinHH:MMformat (hours 0-999). Requiresservice_catalogs_manage.PUT /services-catalogs-areas/{area_id}/items/{id}- Partial update of an item (update_services_catalog_item). Body{ item: { name?, start_time?, end_time? } }. Requiresservice_catalogs_manage.DELETE /services-catalogs-areas/{area_id}/items/{id}- Soft-delete an item (delete_services_catalog_item). Returns 204. Requiresservice_catalogs_manage.
Avançado: execução local (SDK via npx)
Recomendamos oservidor hospedado (https://mcp.tiflux.com — veja Como conectar): sempre atualizado, sem instalação e com mais controle e segurança. A execução local existe para cenários específicos (desenvolvimento, restrições de rede, ambientes offline).
Requisitos: Node.js >= 18.
Execute diretamente via npx:
npx @tiflux/mcp@latestOu instale globalmente:
npm install -g @tiflux/mcpConfiguração no cliente MCP (stdio):
{
"tiflux": {
"command": "npx",
"args": ["@tiflux/mcp@latest"]
}
}A chave de API é lida da variável de ambiente TIFLUX_API_KEY. Crie um arquivo .env (ou exporte as variáveis) com suas credenciais:
# Tiflux API Configuration
TIFLUX_API_KEY=your_api_key_here
# Default values for ticket creation
TIFLUX_DEFAULT_CLIENT_ID=1
TIFLUX_DEFAULT_DESK_ID=1
TIFLUX_DEFAULT_PRIORITY_ID=1
TIFLUX_DEFAULT_CATALOG_ITEM_ID=1Licença
MIT
Suporte
Para suporte, entre em contato com o time Tiflux ou abra uma issue no repositório público.
Available Tools
31 toolscancel_ticketC
Cancelar um ticket específico no TiFlux
| Name | Required | Description | Default |
|---|---|---|---|
| ticket_number | Yes | Número do ticket a ser cancelado (ex: "123", "456") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are available, so the description must disclose behavioral traits. It only states the basic action without mentioning side effects, prerequisites, or result format. Critical information such as whether cancellation is irreversible or requires permissions is missing.
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 concise sentence with no unnecessary words. It is front-loaded and 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 the simplicity (1 parameter, no output schema), the description is incomplete. It lacks details on return values, error conditions, and behavioral expectations. Without annotations, more context is needed.
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 3 applies. The description does not add any additional meaning beyond the schema; the schema already describes the parameter adequately.
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 (cancel) and resource (ticket) in Portuguese. It is specific and distinct from many siblings like 'create_ticket' or 'list_tickets', but does not differentiate from 'close_ticket', which could be a similar action.
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 cancel vs. close or other alternatives. No prerequisites or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_ticketB
Fechar um ticket específico no TiFlux
| Name | Required | Description | Default |
|---|---|---|---|
| ticket_number | Yes | Número do ticket a ser fechado (ex: "123", "456") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must cover behavioral traits. It does not disclose side effects, permissions, or irreversibility of closing a ticket.
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?
Single sentence that is concise and directly states the tool's purpose. 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?
For a simple one-parameter tool with no output schema, the description is minimally adequate but lacks details on return values, confirmation, or constraints.
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 a description for ticket_number. The tool description adds no additional context beyond the schema, so 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 action (fechar) and resource (ticket específico no TiFlux), but does not differentiate from sibling tools like cancel_ticket.
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 like cancel_ticket or update_ticket. No when-not-to conditions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_appointmentA
Criar um novo apontamento (registro de horas trabalhadas) em um ticket específico. Só funciona em tickets de mesas configuradas com apontamentos sem valorização.
| Name | Required | Description | Default |
|---|---|---|---|
| ticket_number | Yes | Número do ticket onde será criado o apontamento | |
| date | Yes | Data do apontamento no formato YYYY-MM-DD. Não é possível informar uma data futura. | |
| init_time | Yes | Horário de início do atendimento no formato HH:MM (ex: "09:00", "14:30") | |
| end_time | Yes | Horário de fim do atendimento no formato HH:MM (ex: "10:00", "17:30"). Deve ser maior ou igual ao init_time. | |
| description | Yes | Descrição do apontamento (o que foi feito no atendimento) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It confirms the tool creates records (mutation) but lacks details on permissions, reversibility, output, or error conditions.
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 extremely concise with two sentences. The first sentence states the primary action, and the second adds a critical constraint. 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 5 required parameters, no output schema, and no annotations, the description is too minimal. It fails to cover return values, error scenarios, or post-creation behavior, leaving gaps for an agent.
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 no additional parameter semantics beyond the schema, resulting in a neutral score.
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 verb 'criar' (create) and the resource 'apontamento em um ticket específico' (appointment in a specific ticket), distinguishing it from sibling tools like list_appointments.
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 includes an explicit condition for usage: only works on tickets of desks configured with appointments without valuation. It does not mention alternatives or when not to use it, but the condition provides clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_internal_communicationC
Criar uma nova comunicação interna em um ticket específico
| Name | Required | Description | Default |
|---|---|---|---|
| ticket_number | Yes | Número do ticket onde será criada a comunicação interna | |
| text | Yes | Conteúdo da comunicação interna. Aceita Markdown (negrito, listas, cabeçalhos, código) — o MCP converte automaticamente para HTML antes de enviar à API. | |
| files | No | Lista com os caminhos dos arquivos locais a serem anexados (opcional, máximo 10 arquivos de 25MB cada) | |
| files_base64 | No | Lista de arquivos em formato base64 para anexar (alternativa ao parâmetro files, máximo 10 arquivos de 25MB cada) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description lacks behavioral details beyond the basic action. With no annotations provided, the description bears full responsibility for transparency, yet it does not mention side effects, auth requirements, rate limits, or what happens on success/error. The only behavioral hint comes from the schema 'text' parameter about Markdown conversion, but that is not in the description.
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, clear sentence that conveys the core purpose without any wasted words. It is efficiently front-loaded, stating the action and target immediately.
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 tool with 4 parameters, 2 required, and no output schema, the description is too minimal. It does not explain what the tool returns, any constraints (e.g., file size limits from schema are not mentioned), or prerequisites (e.g., ticket must exist). The combination of missing output schema and sparse description leaves gaps in understanding the complete behavior.
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 baseline is 3. The description itself does not add any parameter-specific information; it is a single sentence about the overall tool purpose. Since the schema already describes all parameters thoroughly, the description adds no extra value.
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 verb 'criar' (create) and resource 'comunicação interna em um ticket específico' (internal communication on a specific ticket). It is not a tautology and adds specificity by mentioning the ticket context. However, it does not distinguish itself from sibling tools like 'create_ticket_answer' or 'create_ticket', which have overlapping purposes.
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 no guidance on when to use this tool versus alternatives. There is no mention of prerequisites (e.g., ticket existence), expected context, or when not to use it. Sibling tools like 'get_internal_communication' and 'create_ticket_answer' imply different use cases, but the description offers no differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_ticketA
Criar um novo ticket no TiFlux.
Heuristica mesa-first: Quando o usuario referencia um nome sem qualificar a entidade, use desk_name. So use client_name se o usuario disser explicitamente "cliente" ou "empresa". Para pessoa que vai abrir o ticket, use requestor_name ou requestor_email.
Auto-resolve de solicitante: Se requestor_name for fornecido sem requestor_id e sem requestor_email, o MCP tenta encontrar o solicitante ja existente no tenant automaticamente (evita criar solicitante fantasma). Se encontrar mais de um match, retorna lista para escolha. Se nao encontrar, cria com o nome informado.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Título do ticket | |
| description | Yes | Descrição do ticket. Aceita Markdown (negrito, listas, cabeçalhos, código) — o MCP converte automaticamente para HTML antes de enviar à API. | |
| client_id | No | ID do cliente/empresa (opcional - usa TIFLUX_DEFAULT_CLIENT_ID se não informado) | |
| client_name | No | Nome do cliente (empresa contratante) para busca automática (alternativa ao client_id). Use **apenas** quando o usuario disser explicitamente "cliente" ou "empresa". Para pessoa fisica, use requestor_name. | |
| desk_id | No | ID da mesa (opcional - usa TIFLUX_DEFAULT_DESK_ID se não informado) | |
| desk_name | No | Nome da mesa/equipe para busca automática (alternativa ao desk_id). Aceita nomes parciais (ex: "cansados" resolve para "Dev - Cansados"). **Prefira este campo quando o usuario der um nome sem qualificar a entidade.** | |
| priority_id | No | ID da prioridade (opcional - usa TIFLUX_DEFAULT_PRIORITY_ID se não informado) | |
| services_catalogs_item_id | No | ID do item de catálogo (opcional - usa TIFLUX_DEFAULT_CATALOG_ITEM_ID se não informado) | |
| catalog_item_name | No | Nome do item de catálogo para busca automática (alternativa ao services_catalogs_item_id, requer desk_id ou desk_name) | |
| status_id | No | ID do status (opcional) | |
| requestor_id | No | ID do solicitante (pessoa fisica que abre o ticket). Use quando ja tem o ID do solicitante existente no tenant. O solicitante deve pertencer ao cliente selecionado. | |
| requestor_name | No | Nome do solicitante (pessoa fisica). O MCP tenta resolver automaticamente para requestor_id se o solicitante ja existir no tenant (evita criar solicitante fantasma). Se preferir nao resolver automaticamente, passe requestor_id diretamente. | |
| requestor_email | No | Email do solicitante. Use quando voce ja tem o email exato — o MCP nao tentara resolver para requestor_id (o email e identificador suficiente). | |
| requestor_telephone | No | Telefone do solicitante (opcional) | |
| responsible_id | No | ID do responsável (opcional) | |
| responsible_name | No | Nome do responsável para busca automática (alternativa ao responsible_id) | |
| followers | No | Emails dos seguidores separados por vírgula (opcional) | |
| parent_ticket_number | No | Número do ticket pai. O ticket criado será vinculado como filho deste ticket. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Given no annotations, the description carries full burden. It discloses auto-resolve logic for requestors (attempt to find existing, create if not found), Markdown-to-HTML conversion for description, and partial matching for desk_name. However, it does not mention idempotency, error handling, or whether creation is always successful.
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 with clear sections and front-loaded main purpose. Some redundancy in auto-resolve explanation could be tightened, but overall efficient for the complexity.
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 tool with 18 parameters and no output schema, the description covers key behaviors: auto-resolve, heuristic for entity names, Markdown support. Missing details on what happens when auto-resolve fails or returns multiple matches, and no description of the return value/created ticket. Still fairly comprehensive.
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 significant value beyond schema: explains heuristics for desk_name vs client_name, partial name matching, auto-resolve heuristics, and Markdown conversion. Each parameter's purpose and behavior are enriched with context.
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 'Criar um novo ticket no TiFlux' (create a new ticket), specifying the verb and resource. It is distinct from sibling tools like update_ticket, cancel_ticket, and close_ticket.
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 explicit heuristics: use desk_name when user references a name without qualifying entity, use client_name only when user explicitly says 'cliente' or 'empresa'. Also explains auto-resolve behavior for requestor_name and when to use requestor_email. Clearly differentiates when to use each parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_ticket_answerB
Criar uma nova resposta (comunicação com cliente) em um ticket específico
| Name | Required | Description | Default |
|---|---|---|---|
| ticket_number | Yes | Número do ticket onde será criada a resposta | |
| text | Yes | Conteúdo da resposta que será enviada ao cliente. Aceita Markdown (negrito, listas, cabeçalhos, código) — o MCP converte automaticamente para HTML antes de enviar à API. | |
| with_signature | No | Incluir assinatura do usuário na resposta (padrão: false) | |
| files | No | Lista com os caminhos dos arquivos locais a serem anexados (opcional, máximo 10 arquivos de 40MB cada) | |
| files_base64 | No | Lista de arquivos em formato base64 para anexar (alternativa ao parâmetro files, máximo 10 arquivos de 40MB cada) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must convey behavioral traits. It only states the action, omitting side effects (e.g., whether the ticket status changes, if notifications are sent). Parameter descriptions in the schema provide some detail, but the tool description itself is insufficient.
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 sentence that concisely captures the tool's purpose without extraneous information. It is front-loaded and 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 5 parameters, no output schema, and no annotations, the description is too minimal. It lacks information about what happens upon creation (e.g., return value, confirmation), prerequisites, or constraints beyond parameter definitions. The sibling tools imply context, but the description itself is incomplete.
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 all parameters are described in the input schema. The tool description adds no additional parameter semantics beyond what is already present, meeting the baseline but not exceeding 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 description clearly states the tool creates a new response (customer communication) on a specific ticket. It uses a specific verb and resource, distinguishing it from sibling tools like create_internal_communication.
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 does not provide any guidance on when to use this tool compared to alternatives (e.g., create_internal_communication, update_ticket). No exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_chatA
Exibir detalhes de um chat específico pelo id. Retorna card com status, cliente, responsável, departamento, origem, avaliação e datas.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ID numérico do chat (aceita também string numérica — o handler faz parseInt) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It states the tool returns a card with specific fields, which implies read-only behavior, but does not explicitly confirm read-only operation, permissions, rate limits, or error handling. The lack of explicit safety info is a gap.
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 concise sentence in Portuguese that immediately states the purpose and return value. No filler or redundant 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?
For a simple get-by-ID tool, the description adequately covers the purpose and return content. However, it lacks information about error cases (e.g., chat not found) or permission requirements, which would enhance 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?
The input schema has 100% coverage with a thorough parameter description explaining that the ID accepts numeric strings and that the handler parses them. This adds value beyond the type definition.
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 retrieves a specific chat by ID and returns a card with status, client, responsible, department, origin, evaluation, and dates. This distinguishes it from sibling tools like list_inbox_chats or get_ticket.
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 implies usage for fetching a single chat by ID but provides no explicit guidance on when to use this versus alternatives like list_my_chats or list_in_attendance_chats. No 'when not to use' or alternative tool references are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_deskA
Retornar configuracoes completas de uma mesa do TiFlux (SLA, tipo de atendimento, campos obrigatorios, comportamento de tickets, etc). Aceita desk_id (numerico) OU desk_name (nome parcial/fuzzy, usa o mesmo mecanismo de Smart Name Resolution). Se ambos informados, desk_id prevalece.
| Name | Required | Description | Default |
|---|---|---|---|
| desk_id | No | ID numerico da mesa. Se informado, usa diretamente (nao chama busca fuzzy). | |
| desk_name | No | Nome (parcial ou exato) da mesa. Aceita abreviações — ex: "cansados" resolve para "Dev - Cansados". Alternativa ao desk_id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the tool returns 'complete settings' and mentions Smart Name Resolution. However, it lacks explicit safety guarantees, side effects, or error behavior. Given no read-only annotation, the agent cannot be sure it's non-destructive.
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 two sentences, concise, and front-loaded with the main purpose. Every word contributes; no fluff 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 retrieval tool with two optional parameters and no output schema, the description covers the essentials: what is returned, how to specify the desk, and parameter interaction. It omits error handling (e.g., desk not found) and assumes the agent knows the structure of returned settings, but is sufficient given the tool's simplicity.
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 for both parameters. The description adds value beyond the schema by explaining the fuzzy match behavior for desk_name (Smart Name Resolution) and the precedence rule when both are provided.
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 retrieves complete desk settings (configurações completas de uma mesa), specifying the resource and action. It distinguishes from siblings like list_desks by focusing on a single desk's full details, and from other get_* tools by the resource type.
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 when to use each parameter (desk_id for direct, desk_name for fuzzy) and the precedence rule. However, it does not explicitly guide when to use this tool over alternatives like list_desks or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_internal_communicationB
Obter uma comunicação interna específica com texto completo
| Name | Required | Description | Default |
|---|---|---|---|
| ticket_number | Yes | Número do ticket da comunicação interna | |
| communication_id | Yes | ID da comunicação interna a ser obtida |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states the tool retrieves a communication with full text, but does not disclose behavioral traits such as authentication requirements, error handling, or whether it is read-only. Minimal transparency beyond the basic action.
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 sentence of 8 words, very concise and efficient. It could be slightly more structured by separating the action from the parameters, but it is appropriately sized.
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 mentions 'com texto completo' (with full text), indicating the return includes the full text, but it lacks details on other return information or error scenarios. For a simple get operation with no output schema, it is minimally adequate but not 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?
Schema description coverage is 100%, so baseline is 3. The description does not add extra meaning beyond the parameter descriptions in the schema, such as clarifying required fields or providing example values.
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 'Obter uma comunicação interna específica com texto completo' clearly states the verb 'obter' (get) and the resource 'comunicação interna' (internal communication). It distinguishes from sibling tools like list_internal_communications (list) and create_internal_communication (create) by specifying a single specific communication.
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 implies usage for retrieving a single communication by ticket_number and communication_id, but lacks explicit guidance on when to use this tool versus listing or creating. No exclusions or alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ticketA
Buscar um ticket específico no TiFlux pelo número. Retorna informações completas incluindo: status (ID e nome), prioridade (ID e nome), mesa (ID e nome), estágio (ID, nome e emoji indicator), catálogo de serviços (área ID/nome, catálogo ID/nome, item ID/nome), responsável (ID, nome e email), cliente (ID, nome e status), criado por (ID e nome), atualizado por (ID e nome), seguidores, tags, datas (criação, atualização, fechamento), horas trabalhadas, SLA (status detalhado), URLs (interna e externa) e campos personalizados opcionais.
| Name | Required | Description | Default |
|---|---|---|---|
| ticket_number | Yes | Número do ticket a ser buscado (ex: "123", "456") | |
| show_entities | No | Incluir TODOS os campos personalizados vinculados ao ticket na resposta (padrão: false) | |
| include_filled_entity | No | Incluir apenas campos personalizados que possuem valores preenchidos (padrão: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. The description discloses what the tool returns but does not explicitly state that it is read-only, idempotent, or mention authentication or rate limits. It adequately conveys safe retrieval behavior but lacks explicit behavioral traits.
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 long sentence that lists many return fields. While informative, it could be more structured with bullet points or shorter sentences. It is not verbose but could be better organized.
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 exists, but the description compensates by comprehensively listing the returned fields (status, priority, desk, stage, service catalog, etc.) and mentions optional custom fields. This provides sufficient context for understanding the tool's output.
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?
All 3 parameters are described in the schema (100% coverage). The description adds context by explaining that show_entities includes all custom fields and include_filled_entity filters to filled ones, providing meaning beyond the schema's brief 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?
Clearly states 'Buscar um ticket específico no TiFlux pelo número'—a specific verb and resource. The description differentiates from sibling tools like list_tickets (returns multiple) and get_ticket_files (specific subset), making its 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?
The description implies when to use (when you need full details of a specific ticket) but does not explicitly state when not to use or suggest alternatives. No direct guidance on choosing among siblings like get_ticket_files or get_ticket_stages_slas.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ticket_filesB
Buscar arquivos anexados a um ticket específico no TiFlux
| Name | Required | Description | Default |
|---|---|---|---|
| ticket_number | Yes | Número do ticket para buscar os arquivos anexados (ex: "123", "456") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. However, it does not disclose any behavioral traits beyond the basic purpose, such as whether it is read-only, pagination, error handling, or performance implications. The description is minimal.
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, concise sentence. It is appropriately sized for a simple tool. However, it is in Portuguese while the tool name is in English, which may slightly hinder immediate clarity, but overall it is 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 the tool's simplicity (one required parameter, no output schema), the description is adequate but incomplete. It does not describe the return format, possible file types, or any additional context needed for effective use. It meets minimal requirements but lacks 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%, with ticket_number described. The description does not add significant meaning beyond what the schema provides; it merely reiterates the parameter. However, since coverage is high, a baseline of 3 is appropriate, but no extra value is added.
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: retrieving files attached to a specific ticket in TiFlux. It uses a specific verb-resource combination ('buscar arquivos anexados a um ticket') and distinguishes itself from sibling tools like create_ticket or get_ticket which serve different functions.
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. There is no mention of prerequisites, context for usage, or conditions where it should not be used. The description only states the basic action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ticket_stages_slasA
Listar o histórico de passagens do ticket pelos estágios da mesa, com duração no expediente, expiração e status do SLA por estágio. Retorna apenas tickets de mesas com SLA ativo (mesas sem SLA retornam lista vazia). Suporta paginação.
| Name | Required | Description | Default |
|---|---|---|---|
| ticket_number | Yes | Número do ticket para buscar o histórico de estágios e SLAs (ex: "123", "456") | |
| offset | No | Número da página a retornar (padrão: 1) | |
| limit | No | Número de registros por página (padrão: 20, máximo: 200) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must convey behavioral traits. It discloses that the tool returns stage history with duration, expiration, and SLA status, and that desks without SLA yield an empty list. It implies a read operation. No destructive behavior is indicated, and the description is consistent.
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 two sentences, each adding essential information: the core function and an important behavioral caveat. No redundant or verbose language.
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 output schema and annotations, the description explains what the tool returns (stage history with timings and SLA status) and its boundary conditions (SLA active desks only). It is sufficient for an agent to decide when to invoke the tool and what to expect.
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?
All three parameters are fully described in the schema (100% coverage). The description adds value by clarifying that 'offset' represents page number and that pagination is supported, which aids understanding beyond the raw schema fields.
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 the history of ticket stage passages with SLA-related data. It specifies the resource ('histórico de passagens do ticket pelos estágios da mesa') and distinguishes from siblings like 'get_ticket' or 'list_tickets'.
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 includes a key usage condition: 'Retorna apenas tickets de mesas com SLA ativo (mesas sem SLA retornam lista vazia)', guiding when to expect results. It also mentions pagination support. However, it does not explicitly list alternatives or 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.
list_appointmentsA
Listar apontamentos (registros de horas trabalhadas) de um ticket específico com filtros opcionais. Quando disponível, inclui informações de valorização (tipo de atendimento, contrato ou serviço avulso, deslocamento, valor cobrado) e geolocalização.
| Name | Required | Description | Default |
|---|---|---|---|
| ticket_number | Yes | Número do ticket para listar os apontamentos | |
| user_id | No | Filtrar pelo ID do usuário que realizou o apontamento (opcional) | |
| start_date | No | Retorna apontamentos realizados a partir dessa data no formato YYYY-MM-DD (opcional) | |
| end_date | No | Retorna apontamentos realizados até essa data no formato YYYY-MM-DD (opcional) | |
| offset | No | Número da página a ser retornada (padrão: 1) | |
| limit | No | Número de apontamentos por página (padrão: 20, máximo: 200) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It mentions that valuation info and geolocation are included when available, adding some behavioral context, but it does not disclose pagination behavior or confirm it is read-only.
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 with no waste. The first sentence states the core purpose, and the second adds valuable context. Highly concise and 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?
With 6 parameters and no output schema, the description is adequate but not fully complete. It hints at return content (valuation, geolocation) but does not describe the structure of the returned list or pagination behavior.
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 no additional semantic meaning beyond the schema for the parameters, only a general note about included information.
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 verb 'listar' and the resource 'apontamentos' (hour records) for a specific ticket, with optional filters. It distinguishes from sibling tools like create_appointment and list_tickets.
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 implies usage for listing work logs of a ticket but provides no explicit guidance on when to use vs alternatives or when not to use it. No exclusions or comparisons are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_archived_chatsB
Listar chats arquivados (finalizados ou cancelados) com filtros opcionais. Exibe avaliação do atendimento e status de cancelamento.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | Número da página a ser retornada (padrão: 1, mínimo: 1) | |
| limit | No | Número de chats por página (padrão: 20, máximo: 200) | |
| department_id | No | Filtrar por ID do departamento (opcional) | |
| client_id | No | Filtrar por ID do cliente (opcional) | |
| requestor_id | No | Filtrar por ID do requerente — deve ser maior que 0 (opcional) | |
| number | No | Filtrar por número de contato WhatsApp — requer licença WhatsApp (opcional) | |
| origins | No | Canal(is) de origem separados por vírgula: chat, site_widget, campaign, whatsapp, whatsapp_web, gupshup, whatsapp_cloud (opcional) | |
| started_by | No | Tipo de iniciador do chat: Client, Attendant, Campaign, API (opcional) | |
| canceled | No | Filtrar por cancelamento: true = somente cancelados, false = somente finalizados normalmente, omitido = todos os arquivados (opcional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description bears full responsibility for behavioral disclosure. It reveals that the tool shows service evaluation and cancellation status, which adds value. However, it does not describe scope, ordering, pagination behavior, or potential performance impacts. Some key behavior (e.g., what 'archived' means, if results are limited to the user) is omitted.
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 two sentences in Portuguese, very concise and front-loaded. The first sentence states the core purpose, and the second adds key output details. No extraneous words or filler.
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 has 9 optional parameters and no output schema. The description covers the basic operation and mentions two output fields (evaluation, cancellation). However, it does not describe the overall return structure (e.g., pagination metadata, fields like client, department, etc.), which would be helpful given the absence of an output schema.
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?
All 9 parameters are fully described in the input schema (100% coverage). The description only mentions 'optional filters' without adding any extra context or clarifying parameter relationships. Since the schema already handles parameter semantics, the description provides no additional value beyond 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 that the tool lists archived (finished or canceled) chats with optional filters. It specifies the resource and action, and mentions output details like evaluation and cancellation status. However, it does not explicitly differentiate from sibling tools like list_in_attendance_chats or list_my_chats, though the term 'archived' implies a specific state.
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 no guidance on when to use this tool versus alternatives. It does not mention that this is for archived chats only, nor any prerequisites or exclusions. The agent must infer from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_desk_prioritiesA
Listar prioridades configuradas em uma mesa do TiFlux. Use para descobrir os IDs de prioridade antes de criar ou atualizar tickets (ex: "alta prioridade" → priority_id). Aceita desk_id (numerico) OU desk_name (nome parcial/fuzzy). Se ambos informados, desk_id prevalece. O filtro priority_name e feito client-side com fuzzy match apos buscar os registros da API.
| Name | Required | Description | Default |
|---|---|---|---|
| desk_id | No | ID numerico da mesa. Se informado, usa diretamente (nao chama busca fuzzy de mesa). | |
| desk_name | No | Nome (parcial ou exato) da mesa. Aceita abreviacoes — ex: "suporte" resolve para a mesa de suporte. Alternativa ao desk_id. | |
| priority_name | No | Filtro opcional por nome de prioridade (fuzzy client-side). Ex: "alta" filtra prioridades cujo nome contem "alta". | |
| limit | No | Numero de resultados por pagina (padrao: 20, maximo: 200) | |
| offset | No | Numero da pagina (padrao: 1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses key behavioral traits: acceptance of numeric ID or fuzzy-matched name for desk, precedence rules, and client-side fuzzy filtering for priorities. However, it does not explicitly state whether the operation is read-only or non-destructive, which is implied but not confirmed for an agent.
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 three sentences covering purpose, parameter usage, and a behavioral detail. Every sentence is relevant and efficiently communicates essential information without 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?
The description covers the primary use case and parameter options but omits details about the response format (e.g., list of priorities with IDs and names) and pagination behavior (limit/offset). Given 5 parameters and no output schema, more context on expected output would improve completeness for an agent.
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 some context beyond the schema, such as the precedence of desk_id over desk_name when both are provided, but the schema already describes this. The client-side fuzzy match for priority_name is also described in the schema. Thus, minimal additional meaning.
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 configured priorities for a desk in TiFlux, with the specific use case of discovering priority IDs before creating or updating tickets. It uniquely identifies the resource (desk priorities) and distinguishes from sibling tools like list_desks or list_tickets, which cover different entities.
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 guidance on when to use the tool ('para descobrir os IDs de prioridade antes de criar ou atualizar tickets'), explains parameter alternatives (desk_id vs desk_name with precedence), and describes the client-side fuzzy filter behavior for priority_name. No exclusions are needed due to lack of overlapping siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_desksA
Listar mesas (desks) disponiveis no TiFlux para descoberta e exploracao. Use para saber quais mesas existem antes de criar/atualizar tickets ou para inspecionar configuracoes.
| Name | Required | Description | Default |
|---|---|---|---|
| active | No | Filtrar mesas ativas (true) ou inativas (false). Padrao: true (apenas mesas ativas). | |
| name | No | Filtro server-side por nome ou display_name da mesa (match exato, case-insensitive). | |
| limit | No | Numero de resultados por pagina (padrao: 20, maximo: 200) | |
| offset | No | Numero da pagina (padrao: 1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must bear the full burden. It declares the tool lists desks but does not mention authorization, side effects, or confirm it is read-only. For a list operation, this is minimally acceptable but lacks explicit behavioral details.
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 two sentences, front-loaded with purpose and immediate usage guidance. 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?
For a list tool with no output schema, the description and schema together provide sufficient context for using the tool. It could mention expected return structure, but the parameters and purpose are well-covered.
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 each parameter having a clear description. The tool description does not add additional meaning beyond the schema, so it meets 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?
Description clearly states the tool lists desks (mesas) in TiFlux for discovery and exploration, with specific use cases (before creating/updating tickets, inspecting configurations). It differentiates from sibling tools like get_desk (singular) and related list tools.
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?
Description explicitly advises when to use the tool ('antes de criar/atualizar tickets ou para inspecionar configuracoes'), providing clear context. It does not explicitly state when not to use it, but alternatives are implied by sibling tools such as get_desk.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_desk_services_catalogsA
Listar catalogos de servicos vinculados a uma mesa do TiFlux. Catalogos sao os "containers" pai — diferentes dos itens de catalogo (use search_catalog_item para itens). Aceita desk_id (numerico) OU desk_name (nome parcial/fuzzy). Se ambos informados, desk_id prevalece. O filtro catalog_name e feito client-side com fuzzy match.
| Name | Required | Description | Default |
|---|---|---|---|
| desk_id | No | ID numerico da mesa. Se informado, usa diretamente (nao chama busca fuzzy de mesa). | |
| desk_name | No | Nome (parcial ou exato) da mesa. Aceita abreviacoes — ex: "suporte" resolve para a mesa de suporte. Alternativa ao desk_id. | |
| catalog_name | No | Filtro opcional por nome de catalogo (fuzzy client-side). Ex: "infra" filtra catalogos cujo nome contem "infra". | |
| limit | No | Numero de resultados por pagina (padrao: 20, maximo: 200) | |
| offset | No | Numero da pagina (padrao: 1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description fully discloses behavior: listing parent containers, fuzzy matching, precedence when both desk_id and desk_name are provided, and client-side filtering. It does not explicitly state read-only nature, but 'listar' implies it. 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?
The description is concise with 4 sentences, each adding value. It starts with the main purpose, then covers desk identification, precedence, and filtering. No extraneous 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 the tool has 5 parameters, no required ones, no output schema, and no annotations, the description provides sufficient context: behavioral details, fuzzy matching, precedence, and client-side filtering. It could mention the return format (list of catalog objects) but is not necessary per rules.
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 context beyond schema by explaining fuzzy matching for desk_name and catalog_name, the precedence rule, and the distinction between catalog and catalog item. This enriches the parameter semantics.
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 catalogs (parent containers) associated with a desk, and distinguishes it from catalog items by directing users to search_catalog_item. The verb 'listar' and resource 'catalogos de servicos vinculados a uma mesa' are specific, differentiating it from siblings.
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 states when to use this tool (listing catalogs) and when to use an alternative (search_catalog_item for items). It provides clear guidance on desk identification via desk_id or desk_name with precedence rules, and mentions fuzzy matching for desk_name and catalog_name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_entitiesA
Listar campos personalizados (entities) disponiveis na organizacao TiFlux. Use para descobrir quais grupos de campos personalizados existem, em quais aplicacoes estao habilitados (ticket, client, etc.) e seus IDs — necessarios para usar list_entity_fields.
| Name | Required | Description | Default |
|---|---|---|---|
| active | No | Filtrar entities ativas (true) ou inativas (false). Padrao: todos. | |
| applied_in | No | Filtrar por aplicacao: "ticket", "client", "solicitant", "services_catalog", "services_catalogs_area", "services_catalogs_item", "equipment". | |
| name | No | Filtro por nome da entity (match parcial). | |
| limit | No | Numero de resultados por pagina (padrao: 20, maximo: 200) | |
| offset | No | Numero da pagina (padrao: 1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must cover behavioral traits. It describes a read operation but does not explicitly state read-only nature or mention pagination, rate limits, or side effects. Sufficient for a simple list operation.
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 efficient sentences with no wasted words. Purpose and use case are front-loaded, and key information is delivered succinctly.
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?
While lacking output schema and annotations, the description provides sufficient context for discovering entities and linking to list_entity_fields. Does not mention pagination details but schema covers limit/offset.
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 parameter details are already in schema. Description adds no extra meaning beyond mentioning 'aplicacoes' which maps to applied_in, but schema already covers that.
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 the tool lists custom fields/entities, specifying it discovers groups, applications, and IDs. It distinguishes from sibling 'list_entity_fields' by noting the IDs are necessary for that tool.
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?
Description explicitly says 'Use to discover...' providing clear usage context. While it does not list when not to use, the purpose is well-defined among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_entity_field_optionsA
Listar opcoes de um subcampo personalizado (entity_field) do tipo single_select ou checkbox no TiFlux. Use para obter os IDs de opcao (entity_field_option_id) necessarios ao preencher campos de multipla escolha via update_ticket_entities.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_field_id | Yes | ID do subcampo (entity_field) cujas opcoes serao listadas. Obrigatorio. Obtenha via list_entity_fields. | |
| value | No | Filtrar opcoes pelo valor/texto (busca parcial). | |
| limit | No | Numero de resultados por pagina (padrao: 20, maximo: 200) | |
| offset | No | Numero da pagina (padrao: 1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, but the description implies a safe read-only operation by stating it lists options. It does not mention destructive behavior or side effects. The description is sufficient for understanding the tool's behavior.
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 sentence that is front-loaded with the purpose. It is concise 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?
While there is no output schema, the description adequately explains the tool's purpose and how to use the parameters. It could mention the return format, but given the tool's simplicity, it is still complete enough.
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%, and the description adds value by explaining how to obtain entity_field_id (via list_entity_fields) and that value enables partial search. It also mentions defaults for limit and offset, adding meaning 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 options of entity fields of types single_select or checkbox, and specifies its purpose: to obtain option IDs needed for update_ticket_entities. This is a specific verb-resource combination that distinguishes from sibling tools like list_entity_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?
The description explicitly says to use this tool to get option IDs for update_ticket_entities, and references list_entity_fields for obtaining entity_field_id. It provides clear context but does not explicitly state when not to use it or mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_entity_fieldsA
Listar subcampos (entity_fields) de um campo personalizado (entity) no TiFlux. Retorna nome, tipo (text, single_select, checkbox, date, etc.), obrigatoriedade e indica quais campos possuem opcoes selecionaveis — use list_entity_field_options nesses casos.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | ID do campo personalizado (entity) cujos subcampos serao listados. Obrigatorio. Obtenha via list_entities. | |
| field_type | No | Filtrar por tipo: "text", "text_area", "currency", "phone", "email", "link", "date", "single_select", "checkbox". | |
| required | No | Filtrar campos obrigatorios (true) ou opcionais (false). | |
| name | No | Filtro por nome do subcampo. | |
| limit | No | Numero de resultados por pagina (padrao: 20, maximo: 200) | |
| offset | No | Numero da pagina (padrao: 1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description bears full burden. It discloses return fields (nome, tipo, obrigatoriedade, selectable options indicator) but lacks detail on authentication, rate limits, or pagination behavior beyond schema.
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, front-loading purpose in a single sentence. It avoids redundancy but could be slightly more structured.
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 list tool with 6 parameters and no output schema, the description adequately covers return values and provides a usage hint for a related tool. It is sufficient for the 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%; description adds no extra meaning beyond schema. It reiterates that entity_id is required and obtainable via list_entities, which is already 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 the verb 'Listar' and the resource 'subcampos (entity_fields) de um campo personalizado (entity)'. It distinguishes from sibling tools like list_entities and list_entity_field_options.
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 tells when to use list_entity_field_options instead, providing explicit guidance for fields with selectable options. However, it does not explicitly contrast with other sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_in_attendance_chatsC
Listar todos os chats em atendimento da organização com filtros opcionais de responsável, status e paginação.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | Número da página a ser retornada (padrão: 1, mínimo: 1) | |
| limit | No | Número de chats por página (padrão: 20, máximo: 200) | |
| department_id | No | Filtrar por ID do departamento (opcional) | |
| client_id | No | Filtrar por ID do cliente (opcional) | |
| requestor_id | No | Filtrar por ID do requerente — deve ser maior que 0 (opcional) | |
| number | No | Filtrar por número de contato WhatsApp — requer licença WhatsApp (opcional) | |
| origins | No | Canal(is) de origem separados por vírgula: chat, site_widget, campaign, whatsapp, whatsapp_web, gupshup, whatsapp_cloud (opcional) | |
| started_by | No | Tipo de iniciador do chat: Client, Attendant, Campaign, API (opcional) | |
| user_id | No | Filtrar por ID do responsável do chat (opcional) | |
| status | No | Filtrar por status do atendimento: waiting_client, waiting_attendance, triage (opcional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions optional filters and pagination but does not indicate that the operation is read-only, safe, or idempotent. There is no mention of authorization needs, rate limits, or response structure.
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, clear sentence with no unnecessary words or repetition. It front-loads the main purpose and includes key filter categories efficiently.
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 10 optional parameters and no output schema or annotations, the description is adequate but not complete. It does not explain the meaning of 'em atendimento' or typical usage patterns. However, the schema covers parameter details, so the description only needs to provide high-level context.
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 baseline is 3. The description adds a high-level summary of filters (responsible, status, pagination) but does not provide additional meaning beyond the schema. The extra value is minimal.
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 chats in attendance with optional filters, specifying the resource (chats em atendimento) and scope (da organização). However, it does not explicitly distinguish from sibling tools like list_archived_chats or list_inbox_chats, relying on the 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?
The description provides no guidance on when to use this tool versus alternatives, nor does it mention prerequisites, exclusions, or typical use cases. The agent receives no direction on selecting this over other list tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_inbox_chatsB
Listar chats na caixa de entrada (chats não assumidos) com filtros opcionais de departamento, cliente, origem e paginação.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | Número da página a ser retornada (padrão: 1, mínimo: 1) | |
| limit | No | Número de chats por página (padrão: 20, máximo: 200) | |
| department_id | No | Filtrar por ID do departamento (opcional) | |
| client_id | No | Filtrar por ID do cliente (opcional) | |
| requestor_id | No | Filtrar por ID do requerente — deve ser maior que 0 (opcional) | |
| number | No | Filtrar por número de contato WhatsApp — requer licença WhatsApp (opcional) | |
| origins | No | Canal(is) de origem separados por vírgula: chat, site_widget, campaign, whatsapp, whatsapp_web, gupshup, whatsapp_cloud (opcional) | |
| started_by | No | Tipo de iniciador do chat: Client, Attendant, Campaign, API (opcional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It only states the basic operation (listing unassigned chats) but does not disclose behavioral traits like read-only nature, pagination behavior, or potential side effects.
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, front-loaded sentence that efficiently conveys the core purpose. Every word is necessary, and it avoids 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 8 parameters and no output schema, the description is too minimal. It fails to mention what the response contains, pagination details, or any additional context needed for an agent to use it 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. The description lists some filters (department, client, origin, pagination) but misses several parameters (requestor_id, number, started_by). It does not add significant meaning beyond the 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 lists chats in the inbox (unassigned chats) with optional filters, distinguishing it from siblings like list_archived_chats and list_in_attendance_chats.
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 no guidance on when to use this tool versus alternatives like list_my_chats or list_in_attendance_chats. It only mentions filters but does not explain context for choosing this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_internal_communicationsB
Listar comunicações internas existentes em um ticket específico
| Name | Required | Description | Default |
|---|---|---|---|
| ticket_number | Yes | Número do ticket para listar as comunicações internas | |
| offset | No | Número da página a ser retornada (padrão: 1) | |
| limit | No | Número de comunicações por página (padrão: 20, máximo: 200) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It does not mention that the operation is read-only, any authorization requirements, pagination behavior, or side effects. The description is insufficient for an uninformed agent.
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 with no redundancy. It is concise but could incorporate more useful information without sacrificing brevity.
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's simplicity (list with pagination) and no output schema, the description is incomplete. It does not hint at the return format, ordering, or how pagination works. The presence of sibling tools like 'get_internal_communication' is not leveraged to clarify distinctions.
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 each parameter described. The description adds no extra meaning beyond the schema (e.g., clarifying the return format or pagination behavior). 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: listing internal communications for a specific ticket. The verb 'list' and resource 'internal communications' are specific, distinguishing it from siblings like 'get_internal_communication' and 'create_internal_communication'.
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 no guidance on when to use this tool versus alternatives (e.g., 'get_internal_communication' for a single item). It lacks when-not-to-use or prerequisite information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_chatsA
Listar chats assumidos pelo usuário autenticado (dono da API key) com filtros opcionais e paginação.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | Número da página a ser retornada (padrão: 1, mínimo: 1) | |
| limit | No | Número de chats por página (padrão: 20, máximo: 200) | |
| department_id | No | Filtrar por ID do departamento (opcional) | |
| client_id | No | Filtrar por ID do cliente (opcional) | |
| requestor_id | No | Filtrar por ID do requerente — deve ser maior que 0 (opcional) | |
| number | No | Filtrar por número de contato WhatsApp — requer licença WhatsApp (opcional) | |
| origins | No | Canal(is) de origem separados por vírgula: chat, site_widget, campaign, whatsapp, whatsapp_web, gupshup, whatsapp_cloud (opcional) | |
| started_by | No | Tipo de iniciador do chat: Client, Attendant, Campaign, API (opcional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states the tool lists chats assumed by the authenticated user and supports pagination, but it does not disclose whether the operation is read-only, any ordering, or the state of chats returned (e.g., in attendance or archived). More behavioral detail would be beneficial.
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 sentence that is front-loaded with the core purpose. It is concise and to the point, with no extraneous 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?
The tool has no output schema, but as a list operation, the return format is important. The description does not specify what fields are returned or pagination metadata. Given the complexity (8 parameters) and sibling tools, the description is adequate but could be more complete by mentioning the output structure.
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 8 parameters. The description mentions 'optional filters and pagination' but does not add meaningful detail beyond what the schema provides. A 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 the verb 'Listar' (list), resource 'chats', and scope 'assumidos pelo usuário autenticado' (assumed by the authenticated user). It also mentions filters and pagination, distinguishing it from siblings like 'list_in_attendance_chats' or 'list_inbox_chats' which likely have different scopes.
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 implies the tool is for listing chats taken by the authenticated user but does not provide explicit guidance on when to use it versus alternatives such as 'list_in_attendance_chats' or 'list_inbox_chats'. There is no mention of when not to use it or comparative context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ticketsA
Lista tickets do TiFlux com filtros. Requer pelo menos um filtro obrigatorio.
Heuristica mesa-first: Quando o usuario referencia um nome sem qualificar a entidade (ex: "tickets do tuitui"), trate o termo como mesa (desk_name) — mesa = equipe e e o filtro mais comum. So use client_name se o usuario disser explicitamente "cliente", "empresa" ou nome corporativo. Para pessoas que abriram o ticket, use requestor_email ou requestor_ids (resolva o ID via search_user). Para o atendente atribuido, use responsible_ids (busque o ID via search_user). Em duvida, pergunte ao usuario.
Entrada do usuario | Filtro a usar |
"tickets do tuitui" (nome sem qualificar) | desk_name="tuitui" |
"tickets da mesa X" ou "equipe Y" | desk_name |
"tickets do cliente Z" ou "empresa ACME" | client_name |
"tickets do Joao" (nome de pessoa) | requestor_email ou requestor_ids |
"tickets atribuidos ao Joao" | responsible_ids (via search_user) |
"tickets aberto por joao@empresa.com" | requestor_email |
| Name | Required | Description | Default |
|---|---|---|---|
| desk_ids | No | IDs das mesas separados por vírgula (ex: "1,2,3") - máximo 15 IDs | |
| desk_name | No | Nome da mesa/equipe para busca automática (alternativa ao desk_ids). Aceita nomes parciais (ex: "cansados" resolve para "Dev - Cansados"). **Prefira este campo quando o usuario der um nome sem qualificar a entidade.** | |
| client_ids | No | IDs dos clientes (empresas) separados por vírgula (ex: "1,2,3") - máximo 15 IDs. Use para filtrar pela empresa contratante, nao pela pessoa que abriu o ticket. | |
| client_name | No | Nome do cliente (empresa contratante) para busca automática (alternativa ao client_ids). Use **apenas** quando o usuario disser explicitamente "cliente", "empresa" ou der um nome corporativo conhecido. Para pessoa fisica, prefira requestor_email. | |
| stage_ids | No | IDs dos estágios separados por vírgula (ex: "1,2,3") - máximo 15 IDs | |
| stage_name | No | Nome do estágio para busca automática (deve ser usado junto com desk_name) | |
| responsible_ids | No | IDs dos responsáveis (atendentes atribuidos) separados por vírgula (ex: "1,2,3") - máximo 15 IDs. Use quando o usuario disser "atribuido a", "responsavel", "atendente". | |
| requestor_ids | No | IDs dos solicitantes (pessoa fisica que abriu o ticket) separados por vírgula (ex: "1,2,3") - máximo 15 IDs. Use para filtrar por **pessoa** (nao empresa). Resolva o ID via search_user(type="client"). | |
| requestor_email | No | Email do solicitante (pessoa que abriu o ticket). Use quando o usuario referencia uma **pessoa fisica** ou der um email diretamente. Evita round-trip de resolucao de ID. | |
| offset | No | Número da página (padrão: 1) | |
| limit | No | Número de tickets por página (padrão: 20, máximo: 200) | |
| is_closed | No | Filtrar tickets fechados (padrão: false - apenas abertos) | |
| date_type | No | Tipo de data para filtro: "created_at" (data de criação, padrão) ou "solved_in_time" (data de resolução/fechamento) | |
| start_datetime | No | Data/hora inicial do filtro no formato ISO 8601 (ex: "2024-05-15T00:00:00Z"). Filtra tickets com data >= start_datetime | |
| end_datetime | No | Data/hora final do filtro no formato ISO 8601 (ex: "2024-05-15T23:59:59Z"). Filtra tickets com data <= end_datetime |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must cover behavior. It mentions pagination (offset/limit defaults and max) and filter logic, but does not disclose the return format, potential errors (e.g., missing filter), authentication needs, or rate limits. It is adequate but lacks full behavioral disclosure.
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 longer than average but well-structured with a table and clear sections. It frontloads the main purpose and then provides detailed heuristics. Every sentence adds value, though some repetition exists between schema descriptions and the heuristic. Overall, it is concise relative to the complexity.
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 15 parameters and no output schema, the description covers filter logic thoroughly but misses the return value format and any constraints like the required filter (schema says required is empty, but description states 'at least one filter required' – a minor contradiction). It also doesn't mention when to use list_tickets vs get_ticket. The heuristic is strong, but completeness is not fully achieved.
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?
Despite 100% schema coverage, the description adds significant value beyond the schema with a heuristic table, examples (e.g., 'cansados' for desk_name), and resolution strategies (using search_user for IDs). It transforms parameter understanding into a decision tree for user intents, making it highly semantic.
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 tickets from TiFlux with filters, using a specific verb and resource. It distinguishes itself from create, get, and close siblings by focusing on listing. However, it doesn't explicitly differentiate from other list tools like list_appointments, though the name and context make it clear.
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 when-to-use guidance, including a heuristic table mapping user input types to the correct filters (e.g., desk_name vs client_name vs requestor_email). It also advises when not to use certain parameters and how to resolve IDs via search_user, offering comprehensive decision context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_catalog_itemA
Buscar itens de catálogo de serviços por termo livre (catálogo, área ou item) ou por nome/filtro dentro de uma mesa específica. Use o parâmetro search para busca server-side por termo aproximado em nome de catálogo, área ou item — retorna listagem com hierarquia completa. Use catalog_item_name para localizar um item específico por nome (busca client-side, colapsa para detalhe único quando há 1 match). Os itens de catálogo representam os tipos de solicitações que podem ser criadas em uma mesa.
| Name | Required | Description | Default |
|---|---|---|---|
| desk_id | No | ID da mesa onde buscar itens de catálogo (use desk_id OU desk_name) | |
| desk_name | No | Nome da mesa para busca automática (alternativa ao desk_id). Aceita nomes parciais (ex: "cansados" resolve para "Dev - Cansados"). | |
| search | No | Termo livre para busca server-side por nome de catálogo, área ou item de serviço. Busca parcial, sem distinção de maiúsculas/minúsculas e ignora acentos. Retorna listagem com hierarquia completa (catálogo → área → item). Combine com area_id ou catalog_id para restringir o escopo. | |
| catalog_item_name | No | Nome do item de catálogo a ser buscado (busca client-side, parcial, case-insensitive, somente por nome do item). 1 match → detalhe; múltiplos → erro com lista. Opcional quando search, area_id ou catalog_id são fornecidos. | |
| area_id | No | ID da área de serviços para filtrar os resultados. Quando fornecido sem catalog_item_name ou search, lista todos os itens da área. | |
| catalog_id | No | ID do catálogo de serviços para filtrar os resultados. Quando fornecido sem catalog_item_name ou search, lista todos os itens do catálogo. | |
| limit | No | Número de itens por página (padrão: 20, máximo: 200) | |
| offset | No | Número da página a ser retornada (padrão: 1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description discloses behavioral traits: server-side vs client-side search, partial matching, case-insensitive, hierarchy in results, collapse to single detail on exact match, and error with list on multiple matches. It does not mention auth needs or rate limits, but for a search tool this is adequate.
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 paragraph that is front-loaded with the overall purpose, then explains the two main search modes. It is concise and structured logically, with no redundant 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 the tool complexity (8 parameters, no output schema, no annotations), the description covers all parameter semantics and search behaviors. It describes the return format (list with hierarchy or detail) and error condition. It is complete enough for an AI 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?
All 8 parameters have descriptions in the schema (100% coverage). The description adds significant value by explaining the semantic difference between `search` and `catalog_item_name`, the behavior of `desk_name` as a fuzzy match, and how parameters interact (e.g., combine with area_id). This goes beyond what the schema provides.
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 searches for service catalog items by free text or by name/filter within a specific desk. It identifies the action (search), resource (catalog items), and method (by term or name). It does not explicitly differentiate from sibling tools, but the domain is distinct enough.
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 clear guidance on when to use `search` (server-side, approximate term) vs `catalog_item_name` (client-side, specific name). It also mentions combining with `area_id` or `catalog_id` to restrict scope. It lacks explicit when-not-to-use scenarios but covers parameter usage well.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_clientA
Buscar clientes no TiFlux por nome
| Name | Required | Description | Default |
|---|---|---|---|
| client_name | Yes | Nome do cliente a ser buscado (busca parcial) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden for behavioral disclosure. It only states the search functionality without mentioning any behavioral traits such as idempotency, rate limits, or pagination. For a read-only tool, this is insufficient.
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 sentence that is front-loaded with the key information. Every word serves a purpose, making it highly concise and 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?
Despite the absence of an output schema, the description is fairly complete for a simple search tool with one parameter. It could mention that the output is a list of matching clients, but the tool name and context imply this. No major gaps.
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 schema description coverage is 100%, with the parameter 'client_name' already described as partial search. The tool description adds no additional meaning beyond what the schema provides, so a baseline score 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 the verb 'Buscar' (search), the resource 'clientes' (clients), and the context 'no TiFlux' (in TiFlux) with the criterion 'por nome' (by name). This distinguishes it from sibling search tools like search_user or search_stage.
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 clear context for when to use this tool (to search clients by name), but does not explicitly mention when not to use it or provide alternatives. The context is clear enough for an agent to differentiate from sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_stageC
Buscar estagios de uma mesa no TiFlux para usar em atualizacao de tickets
| Name | Required | Description | Default |
|---|---|---|---|
| desk_id | No | ID da mesa para buscar estagios | |
| desk_name | No | Nome da mesa para busca automatica (alternativa ao desk_id). Aceita nomes parciais (ex: "cansados" resolve para "Dev - Cansados"). | |
| limit | No | Numero de resultados por pagina (padrao: 20, maximo: 200) | |
| offset | No | Numero da pagina (padrao: 1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose behavioral traits such as read-only nature, required permissions, or pagination details. It only states the basic function without addressing side effects or constraints.
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 clear sentence with no unnecessary words. It could be more structured, but it is efficient and 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?
Given the lack of output schema and annotations, the description is incomplete. It does not explain the return format (e.g., list of stage objects) or how to use the results for ticket updates, leaving gaps for effective tool invocation.
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 all parameters having descriptions. The tool description does not add meaning beyond the schema, so a 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 the tool searches for stages of a desk in TiFlux for use in ticket updates. It uses specific verb 'Buscar' and resource 'estagios de uma mesa', and the context of ticket updates distinguishes it from siblings like 'get_ticket_stages_slas'.
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. While it mentions the use case (ticket updates), it does not specify when not to use it or name sibling tools that might be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_userA
Buscar usuarios no TiFlux por nome para usar como responsavel em tickets
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Nome do usuario a ser buscado (busca parcial) | |
| type | No | Tipo de usuario (client, attendant, admin) | |
| active | No | Filtrar usuarios ativos (true) ou inativos (false) | |
| limit | No | Numero de resultados por pagina (padrao: 20, maximo: 200) | |
| offset | No | Numero da pagina (padrao: 1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so description carries full burden. It implies a read-only search but does not disclose behavioral traits like authentication needs, pagination details, or that it returns user data. Minimal beyond schema.
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, well-structured sentence that front-loads the purpose. No unnecessary words or 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?
The description is adequate for a simple search tool but lacks information about return values and how results relate to the intended use case. Given no output schema, this is a gap.
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 context about the use case but no new parameter semantics beyond what the schema already provides (e.g., partial search for name).
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 searches users by name in TiFlux for the specific purpose of assigning them as responsible for tickets. It distinguishes from sibling tools like search_client and search_stage.
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 gives a clear context: to find users to set as ticket responsible. However, it does not explicitly exclude other uses or compare to alternatives like search_client.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_ticketA
Atualizar um ticket existente no TiFlux.
Heuristica mesa-first: Quando o usuario referencia um nome sem qualificar a entidade, use desk_name. So use client_id se o usuario disser explicitamente "cliente" ou "empresa". Para pessoa, use responsible_name/responsible_id para atendente atribuido.
Nota: A API v2 nao permite alterar o solicitante (requestor) em um ticket existente via update. Para vincular solicitante, use create_ticket.
| Name | Required | Description | Default |
|---|---|---|---|
| ticket_number | Yes | Número do ticket a ser atualizado (ex: "123", "456") | |
| title | No | Novo título do ticket (opcional) | |
| description | No | Nova descrição do ticket (opcional). Aceita Markdown (negrito, listas, cabeçalhos, código) — o MCP converte automaticamente para HTML antes de enviar à API. | |
| client_id | No | Novo ID do cliente/empresa (opcional). Use quando o usuario disser explicitamente "cliente" ou "empresa". | |
| desk_id | No | Novo ID da mesa (opcional - LIMITAÇÃO: API não suporta transferência de mesa via update) | |
| desk_name | No | Nome da mesa/equipe para busca automática (alternativa ao desk_id). Aceita nomes parciais (ex: "cansados" resolve para "Dev - Cansados"). **Prefira este campo quando o usuario der um nome sem qualificar a entidade.** | |
| stage_id | No | ID do estágio/fase do ticket (opcional) | |
| stage_name | No | Nome do estágio para busca automática (alternativa ao stage_id, requer desk_id ou desk_name) | |
| responsible_id | No | ID do responsável (opcional - use null ou omita para remover responsável) | |
| responsible_name | No | Nome do responsável para busca automática (alternativa ao responsible_id) | |
| followers | No | Emails dos seguidores separados por vírgula (opcional) | |
| services_catalogs_item_id | No | ID do item de catálogo para atualizar mesa com item específico (opcional) | |
| catalog_item_name | No | Nome do item de catálogo para busca automática (alternativa ao services_catalogs_item_id, requer desk_id ou desk_name) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Nenhuma anotação fornecida, então a descrição carrega todo o peso. Revela que a API v2 não permite alterar solicitante, que desk_id não suporta transferência via update, que o campo description aceita Markdown e é convertido para HTML, e que responsible_id pode ser null para remover responsável. Esses comportamentos vão além do que está no schema.
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 descrição tem seções claras (propósito, heurística, nota) e informações importantes estão no início. É um pouco longa devido aos detalhes, mas cada frase contribui para a clareza. Não é excessivamente prolixa.
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 cobre comportamento, parâmetros, limitações e alternativas. A ausência de schema de saída não é compensada por menção ao retorno, mas para uma ferramenta de atualização, isso pode ser inferido. Dados os 13 parâmetros e a complexidade, a descrição é bastante completa.
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 schema é 100% (todos os parâmetros com descrição), então a linha de base é 3. A descrição adiciona valor extra, como a preferência por desk_name sobre client_id, a conversão automática de Markdown em description, e a busca automática por nome em desk_name, stage_name, catalog_item_name. Isso justifica um 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?
A primeira frase define claramente a ação: 'Atualizar um ticket existente no TiFlux.' O verbo 'atualizar' e o recurso 'ticket' são específicos. Distingue-se de ferramentas irmãs como create_ticket, cancel_ticket e close_ticket.
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 orientação explícita sobre quando usar desk_name vs client_id ('heurística mesa-first'), e indica explicitamente uma alternativa (create_ticket) para vincular solicitante, uma vez que a API v2 não permite alterá-lo via update. Também menciona a limitação de transferência de mesa.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_ticket_entitiesA
Atualizar campos personalizados (entities) de um ticket no TiFlux. Suporta até 50 campos por requisição. Para campos checkbox com múltiplas opções, envie um item por opção com entity_field_id + entity_field_option_id + value: "true"/"false". Use list_entity_field_options para descobrir os IDs de opção.
| Name | Required | Description | Default |
|---|---|---|---|
| ticket_number | Yes | Número do ticket a ser atualizado | |
| entities | Yes | Lista de campos personalizados a serem atualizados. Para checkbox multiplo: envie um item por opcao com entity_field_id, entity_field_option_id e value: "true" ou "false". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It mentions the 50-field limit and checkbox handling, but does not disclose whether the operation is atomic, if it overwrites or merges entities, permissions required, or error handling behavior.
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, front-loaded with the purpose, and each sentence adds necessary information without 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?
The description covers key aspects like field limits, checkbox handling, and value formatting. However, it lacks information about error scenarios, what happens on partial failures, and the return value (no output schema). Given the tool's complexity, these gaps are minor.
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 parameter descriptions. The tool description adds value beyond the schema by explaining the 50-field limit, how to find option IDs using list_entity_field_options, and the exact formatting for different entity types (e.g., currency, phone, date).
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 custom fields (entities) of a ticket in TiFlux, specifies a 50-field limit, and explains how to handle checkbox fields. It distinguishes itself from the sibling 'update_ticket' tool which likely handles standard 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?
The description provides some contextual usage (e.g., how to handle checkboxes and use list_entity_field_options), but does not explicitly state when to use this tool versus alternatives like update_ticket, nor does it give 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
31 tool updates
v2.3.0- First observed
cancel_ticket - First observed
close_ticket - First observed
create_appointment - First observed
create_internal_communication - First observed
create_ticket - First observed
create_ticket_answer - First observed
get_chat - First observed
get_desk - First observed
get_internal_communication - First observed
get_ticket - First observed
get_ticket_files - First observed
get_ticket_stages_slas - First observed
list_appointments - First observed
list_archived_chats - First observed
list_desk_priorities - First observed
list_desk_services_catalogs - First observed
list_desks - First observed
list_entities - First observed
list_entity_field_options - First observed
list_entity_fields - First observed
list_in_attendance_chats - First observed
list_inbox_chats - First observed
list_internal_communications - First observed
list_my_chats - First observed
list_tickets - First observed
search_catalog_item - First observed
search_client - First observed
search_stage - First observed
search_user - First observed
update_ticket - First observed
update_ticket_entities
TDQS
Most tools have distinct purposes, with clear prefixes and context. Some potential confusion exists between list_tickets and get_ticket, and between get_chat and list_*_chats, but the descriptions are detailed enough to differentiate.
Predominantly follows verb_noun pattern (e.g., create_ticket, get_ticket, list_tickets). Minor deviations include 'search_catalog_item' instead of 'find_catalog_item' and 'get_ticket_stages_slas' with an irregular plural, but overall consistent.
31 tools is on the higher end but justifiable for a comprehensive ticketing and chat system. Some tools are very specific (e.g., list_entity_field_options), which might add unnecessary complexity for basic use cases.
Covers most lifecycle operations for tickets and chats, including search and customization. Missing delete_ticket and direct client/user management tools, but the core workflows are well-supported.
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
Remote MCP server for managing Muninx tickets, messages, ticket search, and support analytics.
MCP server for Support & Service Management
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
MCP server for Speech-to-Text
Related MCP Servers
AlicenseBqualityBmaintenanceAn MCP server that exposes the Tickiti helpdesk API to AI assistants, enabling ticket management and helpdesk operations via natural language.11MIT- AlicenseNot gradedqualityDmaintenanceMCP server for Request Tracker REST2 API, enabling ticket, queue, user, and asset management via natural language.MIT
- FlicenseAqualityCmaintenanceMCP server for Centreon IT monitoring that enables querying host/service status, managing acknowledgements and downtimes, and retrieving performance metrics via natural language.17-
- AlicenseAqualityBmaintenanceMCP server to manage GestSup tickets via an LLM, with tools for creating, reading, commenting, and searching tickets.13MIT
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/tiflux/tiflux-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server