UNPKG

coreto-mcp-glpi

Version:

MCP Server para integração CORETO AI com GLPI via tools de tickets

129 lines (112 loc) 3.71 kB
import { mcpLogger } from '../logger.js' import { TICKET_STATUS, TICKET_PRIORITY } from '../constants.js' /** * Get ticket status and information from GLPI * @param {Object} args - Tool arguments * @param {Object} tenantContext - Tenant context with GLPI connector * @returns {Object} Tool execution result */ async function getTicketStatus(args, tenantContext) { const logger = mcpLogger.child({ tool: 'get_ticket_status' }) try { const { ticket_id } = args const { glpiConnector, tenant_id } = tenantContext // Validate ticket ID if (!ticket_id) { throw new Error('ID do chamado é obrigatório') } const ticketIdNumber = parseInt(ticket_id) if (isNaN(ticketIdNumber) || ticketIdNumber <= 0) { throw new Error('ID do chamado deve ser um número válido maior que zero') } logger.info('Getting ticket status', { tenantId: tenant_id, ticketId: ticketIdNumber }) // Get ticket from GLPI const ticket = await glpiConnector.getTicket(ticketIdNumber) if (!ticket) { throw new Error(`Chamado #${ticketIdNumber} não encontrado`) } // Format dates const formatDate = (dateStr) => { if (!dateStr || dateStr === '0000-00-00 00:00:00') return null try { return new Date(dateStr).toLocaleString('pt-BR') } catch { return dateStr } } // Build response data const ticketData = { id: ticket.id, title: ticket.name || 'Sem título', status: TICKET_STATUS[ticket.status] || `Status ${ticket.status}`, status_code: ticket.status, priority: TICKET_PRIORITY[ticket.priority] || `Prioridade ${ticket.priority}`, priority_code: ticket.priority, created_date: formatDate(ticket.date), last_update: formatDate(ticket.date_mod), description: ticket.content || 'Sem descrição', category_id: ticket.itilcategories_id || 0, type: ticket.type === 1 ? 'Incidente' : ticket.type === 2 ? 'Solicitação' : 'Outro', urgency: ticket.urgency || 3, impact: ticket.impact || 3 } logger.info('Ticket status retrieved successfully', { tenantId: tenant_id, ticketId: ticketIdNumber, status: ticketData.status }) return { success: true, ticket_id: ticketIdNumber, data: ticketData, message: `Chamado #${ticketIdNumber}: ${ticketData.status}` } } catch (error) { logger.error('Error getting ticket status', { tenantId: tenantContext.tenant_id, error: error.message, args }) // Handle specific error cases if (error.message.includes('not found') || error.message.includes('não encontrado')) { return { success: false, error: `Chamado #${args.ticket_id} não foi encontrado. Verifique se o número está correto.`, code: 'TICKET_NOT_FOUND' } } if (error.message.includes('GLPI')) { return { success: false, error: `Erro de conexão com GLPI: ${error.message}`, code: 'GLPI_CONNECTION_ERROR' } } return { success: false, error: error.message, code: 'TICKET_QUERY_ERROR' } } } // Tool configuration const getTicketStatusTool = { name: 'get_ticket_status', description: 'Consultar informações detalhadas e status atual de um chamado no GLPI', inputSchema: { type: 'object', properties: { ticket_id: { type: 'number', description: 'ID/número do chamado a ser consultado', minimum: 1 } }, required: ['ticket_id'] }, handler: getTicketStatus } export default getTicketStatusTool