@@ -317,21 +317,13 @@ defmodule Trinity.MCP.Client do
317317 defp choose_revision ( state ) do
318318 case request ( state , Wire . discover ( next_id ( ) ) , connect_timeout ( state ) ) do
319319 { :ok , % { "result" => % { "supportedVersions" => versions } } } when is_list ( versions ) ->
320- cond do
321- Wire . modern ( ) in versions -> { :ok , Wire . modern ( ) }
322- Wire . legacy ( ) in versions -> initialize ( state )
323- true -> { :refused , { :unsupported_revisions , versions } }
324- end
320+ pick ( state , versions )
325321
326322 { :ok , % { "error" => % { "code" => - 32_601 } } } ->
327323 initialize ( state )
328324
329325 { :ok , % { "error" => % { "code" => - 32_022 } = error } } ->
330- supported = get_in ( error , [ "data" , "supported" ] ) || [ ]
331-
332- if Wire . legacy ( ) in supported ,
333- do: initialize ( state ) ,
334- else: { :refused , { :unsupported_revisions , supported } }
326+ pick ( state , List . delete ( get_in ( error , [ "data" , "supported" ] ) || [ ] , Wire . modern ( ) ) )
335327
336328 { :ok , % { "error" => error } } ->
337329 { :error , { :discover_refused , error } }
@@ -344,6 +336,17 @@ defmodule Trinity.MCP.Client do
344336 end
345337 end
346338
339+ # The preferred revision when listed, the legacy one when that is, else a refusal naming
340+ # the list. (A -32022 refusal of the modern opener lists what the server serves; the
341+ # modern revision is removed from that list before the pick, since the server just said no.)
342+ defp pick ( state , versions ) do
343+ cond do
344+ Wire . modern ( ) in versions -> { :ok , Wire . modern ( ) }
345+ Wire . legacy ( ) in versions -> initialize ( state )
346+ true -> { :refused , { :unsupported_revisions , versions } }
347+ end
348+ end
349+
347350 defp initialize ( state ) do
348351 client_info = % { "name" => "trinity" , "version" => to_string ( Application . spec ( :trinity , :vsn ) ) }
349352
0 commit comments