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