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
- .build_server ⇒ Object
- .rack_app(allowed_hosts: Safety::RackMiddleware::DEFAULT_ALLOWED_HOSTS) ⇒ Object
- .reset! ⇒ Object
- .server ⇒ Object
Class Method Details
.build_server ⇒ Object
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 |
.server ⇒ Object
31 32 33 |
# File 'lib/rails/hyperdrive/mcp_server.rb', line 31 def server @server ||= build_server end |