@@ -6,6 +6,7 @@ defmodule ElixirLS.LanguageServer.MCP.RequestHandler do
66
77 require Logger
88 alias JasonV
9+ alias ElixirLS.LanguageServer.JsonRpc
910
1011 alias ElixirLS.LanguageServer.Providers.ExecuteCommand . {
1112 LlmDocsAggregator ,
@@ -23,16 +24,131 @@ defmodule ElixirLS.LanguageServer.MCP.RequestHandler do
2324 def handle_request ( request ) do
2425 case request do
2526 % { "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
2761
2862 % { "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
3098
3199 % { "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
33142
34143 % { "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
36152
37153 % { "method" => method , "id" => id } ->
38154 % {
0 commit comments