Spaces:
Build error
Build error
| import React from "react"; | |
| import { useTranslation } from "react-i18next"; | |
| import { MCPConfig, MCPSSEServer, MCPStdioServer } from "#/types/settings"; | |
| import { I18nKey } from "#/i18n/declaration"; | |
| interface MCPConfigViewerProps { | |
| mcpConfig?: MCPConfig; | |
| } | |
| interface SSEServerDisplayProps { | |
| server: string | MCPSSEServer; | |
| } | |
| function SSEServerDisplay({ server }: SSEServerDisplayProps) { | |
| const { t } = useTranslation(); | |
| if (typeof server === "string") { | |
| return ( | |
| <div className="mb-2 p-2 bg-base-tertiary rounded-md"> | |
| <div className="text-sm"> | |
| <span className="font-medium">{t(I18nKey.SETTINGS$MCP_URL)}:</span>{" "} | |
| {server} | |
| </div> | |
| </div> | |
| ); | |
| } | |
| return ( | |
| <div className="mb-2 p-2 bg-base-tertiary rounded-md"> | |
| <div className="text-sm"> | |
| <span className="font-medium">{t(I18nKey.SETTINGS$MCP_URL)}:</span>{" "} | |
| {server.url} | |
| </div> | |
| {server.api_key && ( | |
| <div className="text-sm text-gray-500"> | |
| <span className="font-medium"> | |
| {t(I18nKey.SETTINGS$MCP_API_KEY)}: | |
| </span>{" "} | |
| {server.api_key ? "Set" : t(I18nKey.SETTINGS$MCP_API_KEY_NOT_SET)} | |
| </div> | |
| )} | |
| </div> | |
| ); | |
| } | |
| interface StdioServerDisplayProps { | |
| server: MCPStdioServer; | |
| } | |
| function StdioServerDisplay({ server }: StdioServerDisplayProps) { | |
| const { t } = useTranslation(); | |
| return ( | |
| <div className="mb-2 p-2 bg-base-tertiary rounded-md"> | |
| <div className="text-sm"> | |
| <span className="font-medium">{t(I18nKey.SETTINGS$MCP_NAME)}:</span>{" "} | |
| {server.name} | |
| </div> | |
| <div className="text-sm text-gray-500"> | |
| <span className="font-medium">{t(I18nKey.SETTINGS$MCP_COMMAND)}:</span>{" "} | |
| {server.command} | |
| </div> | |
| {server.args && server.args.length > 0 && ( | |
| <div className="text-sm text-gray-500"> | |
| <span className="font-medium">{t(I18nKey.SETTINGS$MCP_ARGS)}:</span>{" "} | |
| {server.args.join(" ")} | |
| </div> | |
| )} | |
| {server.env && Object.keys(server.env).length > 0 && ( | |
| <div className="text-sm text-gray-500"> | |
| <span className="font-medium">{t(I18nKey.SETTINGS$MCP_ENV)}:</span>{" "} | |
| {Object.entries(server.env) | |
| .map(([key, value]) => `${key}=${value}`) | |
| .join(", ")} | |
| </div> | |
| )} | |
| </div> | |
| ); | |
| } | |
| export function MCPConfigViewer({ mcpConfig }: MCPConfigViewerProps) { | |
| const { t } = useTranslation(); | |
| if ( | |
| !mcpConfig || | |
| (mcpConfig.sse_servers.length === 0 && mcpConfig.stdio_servers.length === 0) | |
| ) { | |
| return null; | |
| } | |
| return ( | |
| <div className="mt-4 border border-base-tertiary rounded-md p-3"> | |
| <div className="flex justify-between items-center mb-3"> | |
| <h3 className="text-sm font-medium"> | |
| {t(I18nKey.SETTINGS$MCP_CONFIGURATION)} | |
| </h3> | |
| <a | |
| href="https://docs.all-hands.dev/usage/mcp" | |
| target="_blank" | |
| rel="noopener noreferrer" | |
| className="text-xs text-blue-400 hover:underline" | |
| onClick={(e) => e.stopPropagation()} | |
| > | |
| {t(I18nKey.SETTINGS$MCP_LEARN_MORE)} | |
| </a> | |
| </div> | |
| <div className="mt-2"> | |
| <div className="flex flex-col gap-4"> | |
| {mcpConfig.sse_servers.length > 0 && ( | |
| <div className="mb-3"> | |
| <h4 className="text-sm font-medium mb-1"> | |
| {t(I18nKey.SETTINGS$MCP_SSE_SERVERS)}{" "} | |
| <span className="text-gray-500"> | |
| ({mcpConfig.sse_servers.length}) | |
| </span> | |
| </h4> | |
| {mcpConfig.sse_servers.map((server, index) => ( | |
| <SSEServerDisplay key={`sse-${index}`} server={server} /> | |
| ))} | |
| </div> | |
| )} | |
| {mcpConfig.stdio_servers.length > 0 && ( | |
| <div> | |
| <h4 className="text-sm font-medium mb-1"> | |
| {t(I18nKey.SETTINGS$MCP_STDIO_SERVERS)}{" "} | |
| <span className="text-gray-500"> | |
| ({mcpConfig.stdio_servers.length}) | |
| </span> | |
| </h4> | |
| {mcpConfig.stdio_servers.map((server, index) => ( | |
| <StdioServerDisplay key={`stdio-${index}`} server={server} /> | |
| ))} | |
| </div> | |
| )} | |
| </div> | |
| </div> | |
| </div> | |
| ); | |
| } | |