Class: Msf::MCP::Tools::SearchModules

Inherits:
MCP::Tool
  • Object
show all
Extended by:
ToolHelper
Defined in:
lib/msf/core/mcp/tools/search_modules.rb

Overview

MCP Tool: Search Metasploit Modules

Searches the Metasploit Framework module database using various criteria. Supports keyword search, filtering by type, platform, and pagination.

Constant Summary

Constants included from ToolHelper

ToolHelper::DANGEROUS_MODE_DISABLED_MESSAGE

Class Method Summary collapse

Methods included from ToolHelper

dangerous_mode_required!, tool_error_response, with_tool_context

Class Method Details

.call(query:, limit: Msf::MCP::Security::InputValidator::LIMIT_DEFAULT, offset: 0, server_context:) ⇒ MCP::Tool::Response

Execute module search

Parameters:

  • query (String)

    Search query

  • limit (Integer) (defaults to: Msf::MCP::Security::InputValidator::LIMIT_DEFAULT)

    Maximum results (default: 100)

  • offset (Integer) (defaults to: 0)

    Results offset (default: 0)

  • server_context (Hash)

    Server context with msf_client, rate_limiter, config

Returns:

  • (MCP::Tool::Response)

    Structured response with search results



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/msf/core/mcp/tools/search_modules.rb', line 94

def call(query:, limit: Msf::MCP::Security::InputValidator::LIMIT_DEFAULT, offset: 0, server_context:)
  with_tool_context(server_context, 'search_modules') do |msf_client|
    # Validate inputs
    Msf::MCP::Security::InputValidator.validate_search_query!(query)
    Msf::MCP::Security::InputValidator.validate_pagination!(limit, offset)

    # Call Metasploit API
    raw_modules, elapsed = Rex::Stopwatch.elapsed_time do
      msf_client.search_modules(query)
    end

    # Transform response
    transformed = Metasploit::ResponseTransformer.transform_modules(raw_modules)

    # Apply pagination
    #
    # Note that to get the total number of entries, we gather the entire data set and apply pagination here
    # instead of sending the limit and offset to the API call to be processed by MSF.
    # This is needed to provide accurate total_items count in the metadata.
    total_items = transformed.size
    paginated_data = transformed[offset, limit] || []

    # Build metadata
     = {
      query: query,
      query_time: elapsed.round(3),
      total_items: total_items,
      returned_items: paginated_data.size,
      limit: limit,
      offset: offset
    }

    # Return MCP response
    ::MCP::Tool::Response.new(
      [
        {
          type: 'text',
          text: JSON.generate(
            metadata: ,
            data: paginated_data
          )
        }
      ],
      structured_content: {
        metadata: ,
        data: paginated_data
      }
    )
  end
end