UNPKG

coreto-mcp-glpi

Version:

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

134 lines (117 loc) 3.76 kB
import { mcpLogger } from '../logger.js' /** * Add followup to a ticket in GLPI * @param {Object} args - Tool arguments * @param {Object} tenantContext - Tenant context with GLPI connector * @returns {Object} Tool execution result */ async function addFollowup(args, tenantContext) { const logger = mcpLogger.child({ tool: 'add_followup' }) try { const { ticket_id, content, is_private = false } = args const { glpiConnector, tenant_id } = tenantContext // Validate required fields if (!ticket_id || !content) { throw new Error('ID do chamado e conteúdo são obrigatórios') } 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') } if (content.length < 3) { throw new Error('Conteúdo do acompanhamento deve ter pelo menos 3 caracteres') } logger.info('Adding followup to ticket', { tenantId: tenant_id, ticketId: ticketIdNumber, contentLength: content.length, isPrivate: is_private }) // Verify ticket exists first try { await glpiConnector.getTicket(ticketIdNumber) } catch (error) { throw new Error(`Chamado #${ticketIdNumber} não encontrado`) } // Add followup via GLPI connector const response = await glpiConnector.addFollowup(ticketIdNumber, content, { isPrivate: is_private }) if (!response.id) { throw new Error('Falha ao adicionar acompanhamento - nenhum ID retornado') } logger.info('Followup added successfully', { tenantId: tenant_id, ticketId: ticketIdNumber, followupId: response.id }) return { success: true, ticket_id: ticketIdNumber, followup_id: response.id, message: `Acompanhamento adicionado ao chamado #${ticketIdNumber} com sucesso!`, data: { followup_id: response.id, ticket_id: ticketIdNumber, content: content, is_private: is_private, created_at: new Date().toISOString() } } } catch (error) { logger.error('Error adding followup', { tenantId: tenantContext.tenant_id, error: error.message, args }) // Handle specific error cases if (error.message.includes('não encontrado') || error.message.includes('not found')) { 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: 'FOLLOWUP_CREATION_ERROR' } } } // Tool configuration const addFollowupTool = { name: 'add_followup', description: 'Adicionar acompanhamento ou comentário a um chamado existente no GLPI', inputSchema: { type: 'object', properties: { ticket_id: { type: 'number', description: 'ID do chamado para adicionar o acompanhamento', minimum: 1 }, content: { type: 'string', description: 'Conteúdo do acompanhamento ou comentário (mínimo 3 caracteres)', minLength: 3, maxLength: 4000 }, is_private: { type: 'boolean', description: 'Se o acompanhamento deve ser privado (visível apenas para técnicos)', default: false } }, required: ['ticket_id', 'content'] }, handler: addFollowup } export default addFollowupTool