coreto-mcp-glpi
Version:
MCP Server para integração CORETO AI com GLPI via tools de tickets
129 lines (112 loc) • 3.71 kB
JavaScript
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