@@ -261,6 +261,40 @@ def _parse_protocol_spec_mcp_url(self) -> Tuple[str, str, Dict[str, str]]:
261261
262262 return url , session_affinity , spec_headers
263263
264+ def _infer_protocol_spec_mcp_session_affinity (self ) -> Optional [str ]:
265+ """从 protocol_spec 推断 MCP session_affinity / Infer MCP session_affinity from protocol_spec
266+
267+ 用于 MCP_REMOTE + proxy_enabled=true 且 mcp_config.session_affinity
268+ 为空的场景。proxy 模式仍使用数据面 URL,不使用 protocol_spec 中的
269+ 上游 URL 和 headers。
270+ Used when MCP_REMOTE proxy is enabled but mcp_config.session_affinity
271+ is empty. Proxy mode still uses data endpoint URL, not upstream URL
272+ or headers from protocol_spec.
273+
274+ Returns:
275+ Optional[str]: MCP_STREAMABLE、MCP_SSE 或 None
276+ """
277+ if not self .protocol_spec :
278+ return None
279+
280+ try :
281+ spec = json .loads (self .protocol_spec )
282+ except (json .JSONDecodeError , TypeError ):
283+ return None
284+
285+ mcp_servers = spec .get ("mcpServers" )
286+ if not mcp_servers or not isinstance (mcp_servers , dict ):
287+ return None
288+
289+ first_server = next (iter (mcp_servers .values ()), None )
290+ if not first_server or not isinstance (first_server , dict ):
291+ return None
292+
293+ transport_type = first_server .get ("transportType" , "sse" )
294+ if transport_type == "streamable-http" :
295+ return "MCP_STREAMABLE"
296+ return "MCP_SSE"
297+
264298 def _get_mcp_endpoint (
265299 self , config : Optional [Config ] = None
266300 ) -> Optional [Tuple [str , str , Dict [str , str ]]]:
@@ -290,9 +324,18 @@ def _get_mcp_endpoint(
290324 if not data_endpoint or not effective_name :
291325 return None
292326
293- session_affinity = pydash .get (
294- self , "mcp_config.session_affinity" , "MCP_SSE"
295- )
327+ session_affinity = pydash .get (self , "mcp_config.session_affinity" )
328+ if not session_affinity :
329+ is_mcp_remote_with_proxy = (
330+ self .create_method == "MCP_REMOTE"
331+ and pydash .get (self , "mcp_config.proxy_enabled" , False )
332+ )
333+ if is_mcp_remote_with_proxy :
334+ session_affinity = (
335+ self ._infer_protocol_spec_mcp_session_affinity ()
336+ )
337+ if not session_affinity :
338+ session_affinity = "MCP_SSE"
296339
297340 if session_affinity == "MCP_STREAMABLE" :
298341 return (
0 commit comments