Module: ActionMCP::Server::Capabilities

Included in:
TransportHandler
Defined in:
lib/action_mcp/server/capabilities.rb

Instance Method Summary collapse

Instance Method Details

#send_capabilities(request_id, params = {}) ⇒ Hash

Handles the ‘initialize’ request. Validates parameters, checks protocol version, stores client info, initializes the session, and returns the server capabilities payload or an error payload.

Parameters:

  • request_id (String, Integer)

    The JSON-RPC request ID.

  • params (Hash) (defaults to: {})

    The JSON-RPC parameters.

Returns:

  • (Hash)

    A hash representing the JSON-RPC response (success or error).



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/action_mcp/server/capabilities.rb', line 12

def send_capabilities(request_id, params = {})
  client_protocol_version = params["protocolVersion"]
  client_info = params["clientInfo"]
  client_capabilities = params["capabilities"]
  session_id = params["sessionId"]

  unless client_protocol_version.is_a?(String) && client_protocol_version.present?
    return send_jsonrpc_error(request_id, :invalid_params, "Missing or invalid 'protocolVersion'")
  end

  unless ActionMCP::SUPPORTED_VERSIONS.include?(client_protocol_version)
    error_message = "Unsupported protocol version. Client requested '#{client_protocol_version}' but server supports #{ActionMCP::SUPPORTED_VERSIONS.join(', ')}"
    error_data = {
      supported: ActionMCP::SUPPORTED_VERSIONS,
      requested: client_protocol_version
    }
    return send_jsonrpc_error(request_id, :invalid_params, error_message, error_data)
  end

  unless client_info.is_a?(Hash)
    return send_jsonrpc_error(request_id, :invalid_params, "Missing or invalid 'clientInfo'")
  end
  unless client_capabilities.is_a?(Hash)
    return send_jsonrpc_error(request_id, :invalid_params, "Missing or invalid 'capabilities'")
  end

  # Handle session resumption if sessionId provided
  if session_id
    existing_session = ActionMCP::Session.find_by(id: session_id)
    if existing_session&.initialized?
      # Resume existing session - update transport reference
      transport.instance_variable_set(:@session, existing_session)

      # Return existing session info
      capabilities_payload = existing_session.server_capabilities_payload
      capabilities_payload[:protocolVersion] = client_protocol_version
      return send_jsonrpc_response(request_id, result: capabilities_payload)
    end
  end

  # Create new session if not resuming
  session.store_client_info(client_info)
  session.store_client_capabilities(client_capabilities)
  session.set_protocol_version(client_protocol_version)

  unless session.initialize!
    return send_jsonrpc_error(request_id, :internal_error, "Failed to initialize session")
  end

  capabilities_payload = session.server_capabilities_payload
  capabilities_payload[:protocolVersion] = client_protocol_version

  send_jsonrpc_response(request_id, result: capabilities_payload)
end