Class: CompletionKit::McpController

Inherits:
Api::V1::BaseController show all
Defined in:
app/controllers/completion_kit/mcp_controller.rb

Constant Summary collapse

PUBLIC_METHODS =
%w[initialize notifications/initialized tools/list].freeze

Instance Method Summary collapse

Instance Method Details

#destroyObject



46
47
48
49
50
# File 'app/controllers/completion_kit/mcp_controller.rb', line 46

def destroy
  session_id = request.headers["Mcp-Session-Id"]
  McpSession.destroy_session(session_id) if session_id
  head :ok
end

#handleObject



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
# File 'app/controllers/completion_kit/mcp_controller.rb', line 12

def handle
  request_body = JSON.parse(request.body.read)
  return unless authorize_mcp_method(request_body["method"])

  if request_body["method"] == "initialize"
    result = McpDispatcher.initialize_session
    session_id = result.delete(:session_id)
    response.headers["Mcp-Session-Id"] = session_id
    render json: jsonrpc_response(request_body["id"], result)
    return
  end

  if request_body["method"] == "notifications/initialized"
    head :ok
    return
  end

  result = McpDispatcher.dispatch(request_body["method"], request_body["params"])
  render json: jsonrpc_response(request_body["id"], result)
rescue JSON::ParserError
  render json: jsonrpc_error(nil, -32700, "Parse error"), status: :bad_request
rescue McpDispatcher::MethodNotFound => e
  render json: jsonrpc_error(request_body.dig("id"), -32601, e.message), status: :ok
rescue McpDispatcher::InvalidParams => e
  render json: jsonrpc_error(request_body.dig("id"), -32602, e.message), status: :ok
rescue ActiveRecord::RecordNotFound => e
  render json: jsonrpc_error(request_body.dig("id"), -32602, e.message), status: :ok
rescue ActiveRecord::RecordInvalid, ActiveRecord::InvalidForeignKey => e
  render json: jsonrpc_error(request_body.dig("id"), -32602, e.message), status: :ok
rescue StandardError => e
  Rails.error.report(e, handled: true, context: { controller: "CompletionKit::McpController" })
  render json: jsonrpc_error(request_body.dig("id"), -32603, "Internal error"), status: :ok
end

#streamObject



7
8
9
10
# File 'app/controllers/completion_kit/mcp_controller.rb', line 7

def stream
  response.set_header("Allow", "POST, DELETE")
  head :method_not_allowed
end