@@ -6,6 +6,7 @@ defmodule ElixirLS.LanguageServer.MCP.RequestHandler do
6
6
7
7
require Logger
8
8
alias JasonV
9
+ alias ElixirLS.LanguageServer.JsonRpc
9
10
10
11
alias ElixirLS.LanguageServer.Providers.ExecuteCommand . {
11
12
LlmDocsAggregator ,
@@ -23,16 +24,131 @@ defmodule ElixirLS.LanguageServer.MCP.RequestHandler do
23
24
def handle_request ( request ) do
24
25
case request do
25
26
% { "method" => "initialize" , "id" => id } ->
26
- handle_initialize ( id )
27
+ try do
28
+ start_time = System . monotonic_time ( :millisecond )
29
+ response = handle_initialize ( id )
30
+ elapsed = System . monotonic_time ( :millisecond ) - start_time
31
+
32
+ JsonRpc . telemetry ( "mcp_request" , % { "elixir_ls.mcp_command" => "initialize" } , % {
33
+ "elixir_ls.mcp_request_time" => elapsed
34
+ } )
35
+
36
+ response
37
+ rescue
38
+ e ->
39
+ message = Exception . format ( :error , e , __STACKTRACE__ )
40
+ Logger . error ( "Error handling initialize: #{ message } " )
41
+
42
+ JsonRpc . telemetry (
43
+ "mcp_request_error" ,
44
+ % {
45
+ "elixir_ls.mcp_command" => "initialize" ,
46
+ "elixir_ls.mcp_error" => "internal_error" ,
47
+ "elixir_ls.mcp_error_message" => message
48
+ } ,
49
+ % { }
50
+ )
51
+
52
+ % {
53
+ "jsonrpc" => "2.0" ,
54
+ "error" => % {
55
+ "code" => - 32603 ,
56
+ "message" => "Internal error"
57
+ } ,
58
+ "id" => id
59
+ }
60
+ end
27
61
28
62
% { "method" => "tools/list" , "id" => id } ->
29
- handle_tools_list ( id )
63
+ try do
64
+ start_time = System . monotonic_time ( :millisecond )
65
+ response = handle_tools_list ( id )
66
+
67
+ elapsed = System . monotonic_time ( :millisecond ) - start_time
68
+
69
+ JsonRpc . telemetry ( "mcp_request" , % { "elixir_ls.mcp_command" => "tools_list" } , % {
70
+ "elixir_ls.mcp_request_time" => elapsed
71
+ } )
72
+
73
+ response
74
+ rescue
75
+ e ->
76
+ message = Exception . format ( :error , e , __STACKTRACE__ )
77
+ Logger . error ( "Error handling tools list call: #{ message } " )
78
+
79
+ JsonRpc . telemetry (
80
+ "mcp_request_error" ,
81
+ % {
82
+ "elixir_ls.mcp_command" => "tools_list" ,
83
+ "elixir_ls.mcp_error" => "internal_error" ,
84
+ "elixir_ls.mcp_error_message" => message
85
+ } ,
86
+ % { }
87
+ )
88
+
89
+ % {
90
+ "jsonrpc" => "2.0" ,
91
+ "error" => % {
92
+ "code" => - 32603 ,
93
+ "message" => "Internal error"
94
+ } ,
95
+ "id" => id
96
+ }
97
+ end
30
98
31
99
% { "method" => "tools/call" , "params" => params , "id" => id } ->
32
- handle_tool_call ( params , id )
100
+ tool_call = Map . get ( params , "name" , "" )
101
+
102
+ try do
103
+ start_time = System . monotonic_time ( :millisecond )
104
+
105
+ response = handle_tool_call ( params , id )
106
+
107
+ elapsed = System . monotonic_time ( :millisecond ) - start_time
108
+
109
+ JsonRpc . telemetry (
110
+ "mcp_request" ,
111
+ % { "elixir_ls.mcp_command" => "tools_call_#{ tool_call } " } ,
112
+ % {
113
+ "elixir_ls.mcp_request_time" => elapsed
114
+ }
115
+ )
116
+
117
+ response
118
+ rescue
119
+ e ->
120
+ message = Exception . format ( :error , e , __STACKTRACE__ )
121
+ Logger . error ( "Error handling tool call: #{ message } " )
122
+
123
+ JsonRpc . telemetry (
124
+ "mcp_request_error" ,
125
+ % {
126
+ "elixir_ls.mcp_command" => "tools_call_#{ tool_call } " ,
127
+ "elixir_ls.mcp_error" => "internal_error" ,
128
+ "elixir_ls.mcp_error_message" => message
129
+ } ,
130
+ % { }
131
+ )
132
+
133
+ % {
134
+ "jsonrpc" => "2.0" ,
135
+ "error" => % {
136
+ "code" => - 32603 ,
137
+ "message" => "Internal error"
138
+ } ,
139
+ "id" => id
140
+ }
141
+ end
33
142
34
143
% { "method" => "notifications/cancelled" , "params" => params } ->
35
- handle_notification_cancelled ( params )
144
+ try do
145
+ handle_notification_cancelled ( params )
146
+ rescue
147
+ e ->
148
+ message = Exception . format ( :error , e , __STACKTRACE__ )
149
+ Logger . error ( "Error handling tool call: #{ message } " )
150
+ nil
151
+ end
36
152
37
153
% { "method" => method , "id" => id } ->
38
154
% {
0 commit comments