Module: Rails::Hyperdrive::McpServer

Defined in:
lib/rails/hyperdrive/mcp_server.rb

Constant Summary collapse

TOOLS =
[
  Tools::DescribeApp,
  Tools::RunRuby,
  Tools::RunSql,
  Tools::TailLogs,
  Tools::ListModels,
  Tools::LocateSource,
  Tools::LookupDoc,
  Tools::ListRoutes
].freeze

Class Method Summary collapse

Class Method Details

.build_serverObject



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
# File 'lib/rails/hyperdrive/mcp_server.rb', line 52

def build_server
  srv = ::MCP::Server.new(
    name: "hyperdrive",
    title: "Rails Hyperdrive",
    version: Rails::Hyperdrive::VERSION,
    instructions: "Rails Hyperdrive MCP server. Prefer locate_source/list_models before guessing.",
    tools: TOOLS,
    resources: [Resources::StackProfile.resource, *Resources::Skill.installed_resources],
    resource_templates: [Resources::Skill.template]
  )

  srv.resources_read_handler do |params|
    uri = params[:uri] || params["uri"]
    if uri == Resources::StackProfile::URI
      Resources::StackProfile.read(params)
    elsif uri.to_s.start_with?(Resources::Skill::URI_PREFIX)
      Resources::Skill.read(params)
    else
      raise ::MCP::Server::RequestHandlerError.new(
        "Resource not found: #{uri}", params, error_type: :invalid_params
      )
    end
  end

  srv
end

.rack_app(allowed_hosts: Safety::RackMiddleware::DEFAULT_ALLOWED_HOSTS) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
# File 'lib/rails/hyperdrive/mcp_server.rb', line 35

def rack_app(allowed_hosts: Safety::RackMiddleware::DEFAULT_ALLOWED_HOSTS)
  # The transport's own DNS-rebinding check requires same-origin (host:port);
  # it is disabled because Safety::RackMiddleware enforces the localhost
  # Origin allowlist, which accepts any port.
  @rack_app ||= Safety::RackMiddleware.new(
    ::MCP::Server::Transports::StreamableHTTPTransport.new(
      server, stateless: true, enable_json_response: true, dns_rebinding_protection: false
    ),
    allowed_hosts: allowed_hosts
  )
end

.reset!Object



47
48
49
50
# File 'lib/rails/hyperdrive/mcp_server.rb', line 47

def reset!
  @server = nil
  @rack_app = nil
end

.serverObject



31
32
33
# File 'lib/rails/hyperdrive/mcp_server.rb', line 31

def server
  @server ||= build_server
end