feat: add SSE and HTTP transport support for MCP servers

- Add type, url, and headers fields to MCP server config
- Update MCP client to handle stdio, sse, and http transports
- Add todos field to ThreadState
- Add Deerflow branding requirement to frontend-design skill
- Update extensions_config.example.json with SSE/HTTP examples

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hetao
2026-01-21 16:14:00 +08:00
parent fbe4d27ddd
commit 5a45b9c131
8 changed files with 98 additions and 14 deletions

View File

@@ -18,3 +18,4 @@ class ThreadState(AgentState):
thread_data: NotRequired[ThreadDataState | None]
title: NotRequired[str | None]
artifacts: NotRequired[list[str] | None]
todos: NotRequired[list | None]

View File

@@ -12,9 +12,12 @@ class McpServerConfig(BaseModel):
"""Configuration for a single MCP server."""
enabled: bool = Field(default=True, description="Whether this MCP server is enabled")
command: str = Field(..., description="Command to execute to start the MCP server")
args: list[str] = Field(default_factory=list, description="Arguments to pass to the command")
type: str = Field(default="stdio", description="Transport type: 'stdio', 'sse', or 'http'")
command: str | None = Field(default=None, description="Command to execute to start the MCP server (for stdio type)")
args: list[str] = Field(default_factory=list, description="Arguments to pass to the command (for stdio type)")
env: dict[str, str] = Field(default_factory=dict, description="Environment variables for the MCP server")
url: str | None = Field(default=None, description="URL of the MCP server (for sse or http type)")
headers: dict[str, str] = Field(default_factory=dict, description="HTTP headers to send (for sse or http type)")
description: str = Field(default="", description="Human-readable description of what this MCP server provides")
model_config = ConfigDict(extra="allow")

View File

@@ -16,9 +16,12 @@ class McpServerConfigResponse(BaseModel):
"""Response model for MCP server configuration."""
enabled: bool = Field(default=True, description="Whether this MCP server is enabled")
command: str = Field(..., description="Command to execute to start the MCP server")
args: list[str] = Field(default_factory=list, description="Arguments to pass to the command")
type: str = Field(default="stdio", description="Transport type: 'stdio', 'sse', or 'http'")
command: str | None = Field(default=None, description="Command to execute to start the MCP server (for stdio type)")
args: list[str] = Field(default_factory=list, description="Arguments to pass to the command (for stdio type)")
env: dict[str, str] = Field(default_factory=dict, description="Environment variables for the MCP server")
url: str | None = Field(default=None, description="URL of the MCP server (for sse or http type)")
headers: dict[str, str] = Field(default_factory=dict, description="HTTP headers to send (for sse or http type)")
description: str = Field(default="", description="Human-readable description of what this MCP server provides")

View File

@@ -18,15 +18,26 @@ def build_server_params(server_name: str, config: McpServerConfig) -> dict[str,
Returns:
Dictionary of server parameters for langchain-mcp-adapters.
"""
params: dict[str, Any] = {
"command": config.command,
"args": config.args,
"transport": "stdio", # Default to stdio transport
}
transport_type = config.type or "stdio"
params: dict[str, Any] = {"transport": transport_type}
# Add environment variables if present
if config.env:
params["env"] = config.env
if transport_type == "stdio":
if not config.command:
raise ValueError(f"MCP server '{server_name}' with stdio transport requires 'command' field")
params["command"] = config.command
params["args"] = config.args
# Add environment variables if present
if config.env:
params["env"] = config.env
elif transport_type in ("sse", "http"):
if not config.url:
raise ValueError(f"MCP server '{server_name}' with {transport_type} transport requires 'url' field")
params["url"] = config.url
# Add headers if present
if config.headers:
params["headers"] = config.headers
else:
raise ValueError(f"MCP server '{server_name}' has unsupported transport type: {transport_type}")
return params

View File

@@ -38,7 +38,7 @@ def get_available_tools(groups: list[str] | None = None, include_mcp: bool = Tru
mcp_tools = get_cached_mcp_tools()
if mcp_tools:
logger.debug(f"Using {len(mcp_tools)} cached MCP tool(s)")
logger.info(f"Using {len(mcp_tools)} cached MCP tool(s)")
except ImportError:
logger.warning("MCP module not available. Install 'langchain-mcp-adapters' package to enable MCP tools.")
except Exception as e: