Class: Tools::FindPublicationsTool

Inherits:
ApplicationTool show all
Defined in:
app/mcp/tools/find_publications_tool.rb

Overview

MCP Tool for finding publications (PDFs, manuals, datasheets).
Publications contain installation guides, technical specifications, and product documentation.

Examples:

Find installation manuals

{ query: "TempZone installation guide", limit: 5 }

Class Method Summary collapse

Class Method Details

.call(query:, product_line: nil, limit: 5, _server_context: nil) ⇒ MCP::Tool::Response

Search current, fully extracted publication embeddings.

Parameters:

  • query (String)

    natural-language publication query

  • product_line (String, nil) (defaults to: nil)

    optional product-line name filter

  • limit (Integer) (defaults to: 5)

    maximum number of publications to return

  • _server_context (Object, nil) (defaults to: nil)

    MCP server context (unused)

Returns:

  • (MCP::Tool::Response)

    JSON response containing current publications



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'app/mcp/tools/find_publications_tool.rb', line 48

def call(query:, product_line: nil, limit: 5, _server_context: nil)
  limit = limit.to_i.clamp(1, 20)

  results = SemanticSearchService.search(
    query,
    limit: limit * 3,
    types: ['publications'],
    published_only: true
  )
  candidates = results.filter_map do |result|
    publication = result[:record]
    next unless publication.is_a?(Item) && publication.is_publication?
    next unless publication.search_text.present? && publication.literature.present?
    next unless publication.publication_visible_to_public?
    next if publication.embedding_stale?(:primary, locale: result[:embedding].locale)

    publication
  end

  if product_line.present?
    ActiveRecord::Associations::Preloader.new(
      records: candidates,
      associations: [:product_lines, { specific_items: :product_lines }]
    ).call
  end
  publications = candidates
                 .select { |publication| product_line.blank? || matches_product_line?(publication, product_line) }
                 .first(limit)

  json_response(
    query: query,
    product_line_filter: product_line,
    total_results: publications.size,
    publications: publications.map { |p| format_publication(p) }
  )
end