iachat/enterprise/app/services/captain/mcp/tool_registry.rb
Rodribm10 42ada8100e feat(captain/mcp): tool check_suite_availability — bridge PlugPlay
Tool nova reusa as Captain::CustomTool 'custom_status_suites_<unidade>'
já cadastradas no painel (Ferramentas) que apontam pro PlugPlay
(oxpi.com.br/PlugPlay/SuitesStatus) com auth headers PLUG-PLAY-ID +
PLUG-PLAY-TOKEN específicos por unit.

Hermes consulta antes de generate_pix pra confirmar disponibilidade.
Resolve unit via Assistant.captain_unit_id; mapping unit → CustomTool é
por substring no nome (qnn/dolce/express/primeal/primevl).

Filtro opcional por suite_category. Retorno textual agrupado por classe
com contagem livre/ocupada e número das suítes livres (max 8).

Validado em Qnn01: 4 hidromassagens livres (101,102,103,108) /
15 Master livres / 5 Standard livres — bate com painel PlugPlay.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 17:10:57 -03:00

48 lines
1.7 KiB
Ruby

# Registry centralizado das tools MCP do Captain.
#
# Adicionar uma tool nova = incluir a classe em TOOLS abaixo. Cada tool
# herda de Captain::Mcp::Tools::BaseTool e responde a .to_mcp_descriptor
# (pra `tools/list`) e #call(args, context:) (pra `tools/call`).
#
# Hermes consulta tools/list pra saber o que pode chamar e tools/call pra
# executar. Toda tool aqui está disponível pra qualquer profile do Hermes
# que se conecte ao MCP server do Captain via `hermes mcp add`.
class Captain::Mcp::ToolRegistry
TOOLS = [
Captain::Mcp::Tools::AddLabelTool,
Captain::Mcp::Tools::FaqLookupTool,
Captain::Mcp::Tools::GeneratePixTool,
Captain::Mcp::Tools::UpdateContactTool,
Captain::Mcp::Tools::GetContactHistoryTool,
Captain::Mcp::Tools::CheckPixPaymentTool,
Captain::Mcp::Tools::SendSuiteImagesTool,
Captain::Mcp::Tools::RescheduleReservationTool,
Captain::Mcp::Tools::ReactToMessageTool,
Captain::Mcp::Tools::CheckSuiteAvailabilityTool,
# Construtor (admin scope) — usadas pelo profile Hermes "construtor" pra criar novos agentes
Captain::Mcp::Tools::ListAssistantsTool,
Captain::Mcp::Tools::GetAssistantPricingTool,
Captain::Mcp::Tools::GetAssistantFaqsTool,
Captain::Mcp::Tools::GetAssistantScenarioTool,
Captain::Mcp::Tools::SaveAgentSpecTool
# Captain::Mcp::Tools::HandoffTool — fluxo via automation hoje, MCP futuro
].freeze
class << self
def descriptors
TOOLS.map(&:to_mcp_descriptor)
end
def find(name)
TOOLS.find { |klass| klass.name == name.to_s }
end
def call(name, args, context:)
klass = find(name)
raise ArgumentError, "Tool não registrada: #{name}" if klass.nil?
klass.new.call(args || {}, context: context || {})
end
end
end