diff --git a/apps/open-swe/src/graphs/manager/nodes/create-new-session.ts b/apps/open-swe/src/graphs/manager/nodes/create-new-session.ts index 619ca337..3cdbff1d 100644 --- a/apps/open-swe/src/graphs/manager/nodes/create-new-session.ts +++ b/apps/open-swe/src/graphs/manager/nodes/create-new-session.ts @@ -126,9 +126,9 @@ ${ISSUE_CONTENT_CLOSE_TAG}`, messages: [ new AIMessage({ id: uuidv4(), - content: `Success! I just created a new session for your request. Thread ID: ${newManagerThreadId} - - TODO: Replace with link to new thread.`, + content: `Success! I just created a new session for your request. Thread ID: \`${newManagerThreadId}\` + +Click [here](/chat/${newManagerThreadId}) to view the thread.`, }), ], }; diff --git a/apps/open-swe/src/utils/mcp-client.ts b/apps/open-swe/src/utils/mcp-client.ts index 29c5588e..37eccca1 100644 --- a/apps/open-swe/src/utils/mcp-client.ts +++ b/apps/open-swe/src/utils/mcp-client.ts @@ -2,6 +2,7 @@ import { MultiServerMCPClient } from "@langchain/mcp-adapters"; import type { StructuredToolInterface } from "@langchain/core/tools"; import { GraphConfig } from "@open-swe/shared/open-swe/types"; import { + McpServerConfig, McpServerConfigSchema, McpServers, } from "@open-swe/shared/open-swe/mcp"; @@ -14,11 +15,52 @@ const logger = createLogger(LogLevel.INFO, "MCP Client"); let mcpClientInstance: MultiServerMCPClient | null = null; let lastConfigHash: string | null = null; +function isLangGraphDocsServer(server: McpServerConfig): boolean { + if (!("command" in server) || !("args" in server)) return false; + + const langgraphMcpServer = Object.values(DEFAULT_MCP_SERVERS)[0]; + + return ( + server.command === langgraphMcpServer.command && + server.args.every((arg, index) => arg === langgraphMcpServer.args[index]) + ); +} + +function validateMcpServers(mcpServers: McpServers): McpServers { + try { + const validatedServers: McpServers = {}; + + for (const [serverName, config] of Object.entries(mcpServers)) { + // Check if the server has http or sse transport/type + const transport = config.transport || config.type; + + if (transport === "http" || transport === "sse") { + validatedServers[serverName] = config; + } else if ( + serverName === Object.keys(DEFAULT_MCP_SERVERS)[0] && + isLangGraphDocsServer(config) + ) { + // Allow LangGraphDocs server to be specified as a stdio server + validatedServers[serverName] = config; + } else { + logger.info( + `Skipping MCP server "${serverName}" - only http and sse transports are supported, got: ${transport || "undefined"}`, + ); + } + } + + return validatedServers; + } catch (error) { + logger.error("Failed to validate MCP servers: ", error); + return {}; + } +} + /** * Returns a shared MCP client instance */ -export function mcpClient(mcpServers: McpServers): MultiServerMCPClient { - const serversToUse = mcpServers; +function mcpClient(mcpServers: McpServers): MultiServerMCPClient { + const serversToUse = validateMcpServers(mcpServers); const configHash = JSON.stringify(serversToUse); // Recreate client if configuration changed diff --git a/apps/web/src/features/settings-page/config-manager.tsx b/apps/web/src/features/settings-page/config-manager.tsx index 8dbee3ac..74134c19 100644 --- a/apps/web/src/features/settings-page/config-manager.tsx +++ b/apps/web/src/features/settings-page/config-manager.tsx @@ -10,11 +10,10 @@ import { } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Alert, AlertDescription } from "@/components/ui/alert"; -import { Settings, AlertTriangle } from "lucide-react"; +import { Settings, AlertTriangle, CircleAlert } from "lucide-react"; import { ConfigField } from "@/components/configuration/config-field"; import { useConfigStore, DEFAULT_CONFIG_KEY } from "@/hooks/useConfigStore"; import { Skeleton } from "@/components/ui/skeleton"; -import { Button } from "@/components/ui/button"; import type { ConfigurableFieldUIMetadata } from "@open-swe/shared/configurable-metadata"; import { GraphConfigurationMetadata } from "@open-swe/shared/open-swe/types"; import { cn } from "@/lib/utils"; @@ -183,6 +182,21 @@ export function ConfigManager() {
+ Notice: Open SWE{" "} + only{" "} + supports MCP servers with HTTP or{" "} + SSE transports (with the exception + of the default LangGraph documentation MCP server). + Other transports will be ignored. +
+