68 lines
2.1 KiB
Python
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,
|
|
)
|