Files
hunjing/backend/app/integrations/mcp/transports/__init__.py
T
2026-08-21 16:00:13 +08:00

68 lines
2.1 KiB
Python

"""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,
)