"""MCP 传输层工厂。 根据 server 的 transport 字段创建对应的 TransportProtocol 实例。 """ from __future__ import annotations import json from typing import Any import httpx from app.integrations.mcp.transports.base import TransportProtocol from app.integrations.mcp.transports.http import StreamableHttpTransport from app.integrations.mcp.transports.stdio import StdioTransport def get_transport( server: Any, http_client: httpx.AsyncClient | None = None, ) -> TransportProtocol: """根据 server 的 transport 字段创建传输层实例。""" transport = server.transport if hasattr(server, "transport") else "streamable-http" if transport == "stdio": args: list[str] = [] if hasattr(server, "args_json") and server.args_json: try: parsed = json.loads(server.args_json) if isinstance(parsed, list): args = [str(a) for a in parsed] except (json.JSONDecodeError, TypeError): pass env: dict[str, str] | None = None if hasattr(server, "env_json") and server.env_json: try: parsed = json.loads(server.env_json) if isinstance(parsed, dict): env = {str(k): str(v) for k, v in parsed.items()} except (json.JSONDecodeError, TypeError): pass cwd: str | None = None if hasattr(server, "cwd") and server.cwd: cwd = server.cwd cmd = getattr(server, "command", None) or "" return StdioTransport( server_id=server.id, server_name=server.name, command=cmd, args=args, env=env, cwd=cwd, ) # 默认 streamable-http endpoint_url = getattr(server, "endpoint_url", None) or "" auth_token = getattr(server, "auth_token", None) return StreamableHttpTransport( server_id=server.id, server_name=server.name, endpoint_url=endpoint_url, auth_token=auth_token, http_client=http_client, )