diff --git a/ui/litellm-dashboard/src/components/mcp_tools/UserEnvVarsModal.tsx b/ui/litellm-dashboard/src/components/mcp_tools/UserEnvVarsModal.tsx index 08a285cd56b..2d79279ceb8 100644 --- a/ui/litellm-dashboard/src/components/mcp_tools/UserEnvVarsModal.tsx +++ b/ui/litellm-dashboard/src/components/mcp_tools/UserEnvVarsModal.tsx @@ -4,6 +4,7 @@ import { useMutation, useQuery } from "@tanstack/react-query"; import { MCPServer, MCPUserEnvVarsStatus } from "./types"; import { getMCPUserEnvVars, storeMCPUserEnvVars } from "../networking"; import NotificationsManager from "../molecules/notifications_manager"; +import { useTranslation } from "react-i18next"; const { Text, Title } = Typography; @@ -24,6 +25,7 @@ interface UserEnvVarsModalProps { */ const UserEnvVarsModal: React.FC = ({ server, open, accessToken, onClose, onSaved }) => { const [form] = Form.useForm(); + const { t } = useTranslation(); const { data: status, @@ -38,12 +40,16 @@ const UserEnvVarsModal: React.FC = ({ server, open, acces const saveMutation = useMutation({ mutationFn: (values: Record) => storeMCPUserEnvVars(accessToken!, server!.server_id, values), onSuccess: (saved) => { - NotificationsManager.success("Credentials saved"); + NotificationsManager.success(t("mcpTools.userEnvVarsModal.savedSuccess")); onSaved?.(saved); onClose(); }, onError: (err) => { - NotificationsManager.fromBackend(`Failed to save env vars: ${err instanceof Error ? err.message : String(err)}`); + NotificationsManager.fromBackend( + t("mcpTools.userEnvVarsModal.saveFailed", { + error: err instanceof Error ? err.message : String(err), + }), + ); }, }); @@ -74,9 +80,9 @@ const UserEnvVarsModal: React.FC = ({ server, open, acces
- Set your credentials + {t("mcpTools.userEnvVarsModal.title")} - Per-user + {t("mcpTools.userEnvVarsModal.perUserTag")}
{displayName} @@ -90,16 +96,12 @@ const UserEnvVarsModal: React.FC = ({ server, open, acces
) : isError ? ( - + ) : required.length === 0 ? ( - + ) : ( <> - - These values are private to you. Your admin configured this MCP server to require these per-user - credentials. Saved values are never shown back; leave an already-set field blank to keep it, or enter a - value to set or change it. - + {t("mcpTools.userEnvVarsModal.privacyNote")}
{required.map((spec) => ( = ({ server, open, acces label={ {spec.name} - {spec.is_set && Set} + {spec.is_set && {t("mcpTools.userEnvVarsModal.setTag")}} } extra={spec.description || undefined} - rules={spec.is_set ? undefined : [{ required: true, message: `${spec.name} is required` }]} + rules={ + spec.is_set + ? undefined + : [{ required: true, message: t("mcpTools.userEnvVarsModal.fieldRequired", { name: spec.name }) }] + } > @@ -124,10 +132,10 @@ const UserEnvVarsModal: React.FC = ({ server, open, acces ))}
diff --git a/ui/litellm-dashboard/src/components/mcp_tools/create_mcp_server.tsx b/ui/litellm-dashboard/src/components/mcp_tools/create_mcp_server.tsx index ddcc9f65d38..94d018e9c73 100644 --- a/ui/litellm-dashboard/src/components/mcp_tools/create_mcp_server.tsx +++ b/ui/litellm-dashboard/src/components/mcp_tools/create_mcp_server.tsx @@ -3,6 +3,8 @@ import { Modal, Tooltip, Form, Select, Input, Switch, Collapse } from "antd"; import { InfoCircleOutlined } from "@ant-design/icons"; import { Button, TextInput } from "@tremor/react"; import { createMCPServer, registerMCPServer, storeMCPOAuthUserCredential } from "../networking"; +import { useTranslation } from "react-i18next"; +import { Trans } from "react-i18next"; import { setToken } from "@/utils/mcpTokenStore"; import { AUTH_TYPE, @@ -70,6 +72,7 @@ const CreateMCPServer: React.FC = ({ onBackToDiscovery, }) => { const [form] = Form.useForm(); + const { t } = useTranslation(); const [isLoading, setIsLoading] = useState(false); const [costConfig, setCostConfig] = useState({}); const [formValues, setFormValues] = useState>({}); @@ -183,9 +186,7 @@ const CreateMCPServer: React.FC = ({ form.setFieldsValue({ credentials }); - NotificationsManager.success( - "OAuth authorization successful! Please click 'Create MCP Server' to save the configuration.", - ); + NotificationsManager.success(t("mcpTools.createMcpServer.oauthAuthSuccess")); } }, onBeforeRedirect: persistCreateUiState, @@ -372,7 +373,7 @@ const CreateMCPServer: React.FC = ({ console.log("Parsed stdio config:", stdioFields); } catch (error) { - NotificationsManager.fromBackend("Invalid JSON in stdio configuration"); + NotificationsManager.fromBackend(t("mcpTools.createMcpServer.invalidJsonStdio")); return; } } @@ -388,7 +389,7 @@ const CreateMCPServer: React.FC = ({ try { tokenValidation = JSON.parse(rawTokenValidationJson); } catch { - NotificationsManager.fromBackend("Invalid JSON in Token Validation Rules"); + NotificationsManager.fromBackend(t("mcpTools.createMcpServer.invalidJsonTokenValidation")); setIsLoading(false); return; } @@ -468,7 +469,7 @@ const CreateMCPServer: React.FC = ({ } NotificationsManager.success( - isAdmin ? "MCP Server created successfully" : "MCP Server submitted for admin review", + isAdmin ? t("mcpTools.createMcpServer.createSuccess") : t("mcpTools.createMcpServer.submitSuccess"), ); form.resetFields(); setCostConfig({}); @@ -483,7 +484,9 @@ const CreateMCPServer: React.FC = ({ } catch (error) { const reason = error instanceof Error ? error.message : String(error); NotificationsManager.fromBackend( - isAdmin ? `Error creating MCP Server: ${reason}` : `Error submitting MCP Server: ${reason}`, + isAdmin + ? t("mcpTools.createMcpServer.createFailed", { reason }) + : t("mcpTools.createMcpServer.submitFailed", { reason }), ); } finally { setIsLoading(false); @@ -537,7 +540,7 @@ const CreateMCPServer: React.FC = ({
{searchValue} - create new group + {t("mcpTools.createMcpServer.createNewGroup")}
), }); @@ -587,7 +590,7 @@ const CreateMCPServer: React.FC = ({ )} MCP Logo = ({ }} />

- {isAdmin ? "Add New MCP Server" : "Submit MCP Server for Review"} + {isAdmin ? t("mcpTools.createMcpServer.modalTitleAdmin") : t("mcpTools.createMcpServer.modalTitleUser")}

} @@ -621,28 +624,27 @@ const CreateMCPServer: React.FC = ({ > {!isAdmin && (
- Your submission will be sent for admin review before it becomes active. Note: the request must be made - with a team-scoped API key. + {t("mcpTools.createMcpServer.nonAdminBanner")}
)}
- MCP Server Name - + {t("mcpTools.createMcpServer.serverNameLabel")} + } name="server_name" rules={[ - { required: false, message: "Please enter a server name" }, + { required: false, message: t("mcpTools.createMcpServer.serverNameRequired") }, { validator: (_, value) => validateMCPServerName(value) }, ]} > @@ -650,8 +652,8 @@ const CreateMCPServer: React.FC = ({ - Alias - + {t("mcpTools.createMcpServer.aliasLabel")} + @@ -660,24 +662,24 @@ const CreateMCPServer: React.FC = ({ rules={[{ required: false }, { validator: (_, value) => validateMCPServerName(value) }]} > setAliasManuallyEdited(true)} /> Description} + label={{t("common.description")}} name="description" rules={[ { required: false, - message: "Please enter a server description", + message: t("mcpTools.createMcpServer.descriptionRequired"), }, ]} > @@ -685,7 +687,11 @@ const CreateMCPServer: React.FC = ({ GitHub / Source URL} + label={ + + {t("mcpTools.createMcpServer.sourceUrlLabel")} + + } name="source_url" > = ({ Transport Type} + label={ + + {t("mcpTools.createMcpServer.transportLabel")} + + } name="transport" - rules={[{ required: true, message: "Please select a transport type" }]} + rules={[{ required: true, message: t("mcpTools.createMcpServer.transportRequired") }]} > {/* URL field - only show for HTTP and SSE */} {(transportType === "http" || transportType === "sse") && ( MCP Server URL} + label={ + + {t("mcpTools.createMcpServer.serverUrlLabel")} + + } name="url" rules={[ - { required: true, message: "Please enter a server URL" }, + { required: true, message: t("mcpTools.createMcpServer.serverUrlRequired") }, { validator: (_, value) => validateMCPServerUrl(value) }, ]} > @@ -748,8 +764,8 @@ const CreateMCPServer: React.FC = ({ - BYOK (Bring Your Own Key) - + {t("mcpTools.createMcpServer.byokLabel")} + @@ -772,7 +788,7 @@ const CreateMCPServer: React.FC = ({
- User keys will be sent as:{" "} + {t("mcpTools.createMcpServer.byokKeysSentAs")}{" "} {getFieldValue("auth_type") === "bearer_token" && "Authorization: Bearer {key}"} {getFieldValue("auth_type") === "token" && "Authorization: token {key}"} @@ -780,7 +796,6 @@ const CreateMCPServer: React.FC = ({ {getFieldValue("auth_type") === "basic" && "Authorization: Basic {key}"} {getFieldValue("auth_type") === "authorization" && "Authorization: {key}"} - {!getFieldValue("auth_type") && "Set Authentication Type below to specify the format."}
)} @@ -788,16 +803,18 @@ const CreateMCPServer: React.FC = ({
- Set the Authentication Type below to specify how user keys are sent - (e.g., Bearer Token, API Key header). + }} + />
)} - Access Description - + {t("mcpTools.createMcpServer.byokAccessDescLabel")} + @@ -806,7 +823,7 @@ const CreateMCPServer: React.FC = ({ > - None - API Key - Bearer Token - Token - Basic Auth - OAuth - AWS SigV4 (Bedrock AgentCore MCPs) + + @@ -859,8 +891,8 @@ const CreateMCPServer: React.FC = ({ - Authentication Value - + {t("mcpTools.createMcpServer.authValueLabel")} + @@ -870,14 +902,14 @@ const CreateMCPServer: React.FC = ({ { validator: (_, value) => value && typeof value === "string" && value.trim() === "" - ? Promise.reject(new Error("Authentication value cannot be empty whitespace")) + ? Promise.reject(new Error(t("mcpTools.createMcpServer.authValueEmpty"))) : Promise.resolve(), }, ]} > @@ -906,27 +938,31 @@ const CreateMCPServer: React.FC = ({ {transportType !== "stdio" && transportType !== "" && isAwsSigV4AuthType && ( <>

- For MCP servers hosted on AWS Bedrock AgentCore.{" "} - - View docs → - + + ), + }} + />

- AWS Region - + {t("mcpTools.createMcpServer.awsRegionLabel")} + } name={["credentials", "aws_region_name"]} - rules={[{ required: true, message: "AWS region is required for SigV4 auth" }]} + rules={[{ required: true, message: t("mcpTools.createMcpServer.awsRegionRequired") }]} > = ({ - AWS Service Name - + {t("mcpTools.createMcpServer.awsServiceNameLabel")} + @@ -952,8 +988,8 @@ const CreateMCPServer: React.FC = ({ - AWS Access Key ID - + {t("mcpTools.createMcpServer.awsAccessKeyIdLabel")} + @@ -965,9 +1001,7 @@ const CreateMCPServer: React.FC = ({ validator(_, value) { const secretKey = getFieldValue(["credentials", "aws_secret_access_key"]); if (secretKey && !value) { - return Promise.reject( - new Error("Access Key ID is required when Secret Access Key is provided"), - ); + return Promise.reject(new Error(t("mcpTools.createMcpServer.awsAccessKeyIdRequired"))); } return Promise.resolve(); }, @@ -975,15 +1009,15 @@ const CreateMCPServer: React.FC = ({ ]} > - AWS Secret Access Key - + {t("mcpTools.createMcpServer.awsSecretKeyLabel")} + @@ -995,9 +1029,7 @@ const CreateMCPServer: React.FC = ({ validator(_, value) { const accessKeyId = getFieldValue(["credentials", "aws_access_key_id"]); if (accessKeyId && !value) { - return Promise.reject( - new Error("Secret Access Key is required when Access Key ID is provided"), - ); + return Promise.reject(new Error(t("mcpTools.createMcpServer.awsSecretKeyRequired"))); } return Promise.resolve(); }, @@ -1005,15 +1037,15 @@ const CreateMCPServer: React.FC = ({ ]} > - AWS Session Token - + {t("mcpTools.createMcpServer.awsSessionTokenLabel")} + @@ -1021,15 +1053,15 @@ const CreateMCPServer: React.FC = ({ name={["credentials", "aws_session_token"]} > - AWS Role ARN - + {t("mcpTools.createMcpServer.awsRoleArnLabel")} + @@ -1037,15 +1069,15 @@ const CreateMCPServer: React.FC = ({ name={["credentials", "aws_role_name"]} > - AWS Session Name - + {t("mcpTools.createMcpServer.awsSessionNameLabel")} + @@ -1053,7 +1085,7 @@ const CreateMCPServer: React.FC = ({ name={["credentials", "aws_session_name"]} > @@ -1127,10 +1159,10 @@ const CreateMCPServer: React.FC = ({
diff --git a/ui/litellm-dashboard/src/locales/en.json b/ui/litellm-dashboard/src/locales/en.json index 89860b6df86..23fbeade1bc 100644 --- a/ui/litellm-dashboard/src/locales/en.json +++ b/ui/litellm-dashboard/src/locales/en.json @@ -3326,6 +3326,100 @@ "required": "Please enter stdio configuration", "invalidJson": "Please enter valid JSON" }, + "userEnvVarsModal": { + "title": "Set your credentials", + "perUserTag": "Per-user", + "loadError": "Failed to load env vars", + "noFieldsConfigured": "No per-user fields configured for this server.", + "privacyNote": "These values are private to you. Your admin configured this MCP server to require these per-user credentials. Saved values are never shown back; leave an already-set field blank to keep it, or enter a value to set or change it.", + "setTag": "Set", + "fieldRequired": "{{name}} is required", + "overwritePlaceholder": "Enter a new value to overwrite", + "enterFieldPlaceholder": "Enter your {{name}}", + "savedSuccess": "Credentials saved", + "saveFailed": "Failed to save env vars: {{error}}", + "saveButton": "Save Credentials" + }, + "createMcpServer": { + "oauthAuthSuccess": "OAuth authorization successful! Please click 'Create MCP Server' to save the configuration.", + "invalidJsonStdio": "Invalid JSON in stdio configuration", + "invalidJsonTokenValidation": "Invalid JSON in Token Validation Rules", + "createSuccess": "MCP Server created successfully", + "submitSuccess": "MCP Server submitted for admin review", + "createFailed": "Error creating MCP Server: {{reason}}", + "submitFailed": "Error submitting MCP Server: {{reason}}", + "createNewGroup": "create new group", + "mcpLogoAlt": "MCP Logo", + "modalTitleAdmin": "Add New MCP Server", + "modalTitleUser": "Submit MCP Server for Review", + "nonAdminBanner": "Your submission will be sent for admin review before it becomes active. Note: the request must be made with a team-scoped API key.", + "serverNameLabel": "MCP Server Name", + "serverNameTooltip": "Best practice: Use a descriptive name that indicates the server's purpose (e.g., 'GitHub_MCP', 'Email_Service'). Cannot contain spaces or hyphens; use underscores instead. Names must comply with SEP-986 and will be rejected if invalid (https://modelcontextprotocol.io/specification/2025-11-25/server/tools#tool-names).", + "serverNameRequired": "Please enter a server name", + "serverNamePlaceholder": "e.g., GitHub_MCP, Zapier_MCP, etc.", + "aliasLabel": "Alias", + "aliasTooltip": "A short, unique identifier for this server. Defaults to the server name if not provided. Cannot contain spaces or hyphens; use underscores instead.", + "descriptionRequired": "Please enter a server description", + "descriptionPlaceholder": "Brief description of what this server does", + "sourceUrlLabel": "GitHub / Source URL", + "transportLabel": "Transport Type", + "transportRequired": "Please select a transport type", + "transportPlaceholder": "Select transport", + "transportHttp": "Streamable HTTP (Recommended)", + "transportSse": "Server-Sent Events (SSE)", + "transportStdio": "Standard Input/Output (stdio)", + "transportOpenapi": "OpenAPI Spec", + "serverUrlLabel": "MCP Server URL", + "serverUrlRequired": "Please enter a server URL", + "byokLabel": "BYOK (Bring Your Own Key)", + "byokTooltip": "When enabled, each user provides their own API key for this service. Keys are stored per-user and never shared.", + "byokKeysSentAs": "User keys will be sent as:", + "byokSetAuthType": "Set the Authentication Type below to specify how user keys are sent (e.g., Bearer Token, API Key header).", + "byokAccessDescLabel": "Access Description", + "byokAccessDescTooltip": "List of permissions shown to users in the connection modal (e.g. 'Create and manage Jira issues')", + "byokAccessDescPlaceholder": "Add access description items (press Enter after each)", + "byokApiKeyHelpUrlLabel": "API Key Help URL", + "byokApiKeyHelpUrlTooltip": "Optional link shown to users to help them find their API key", + "authLabel": "Authentication", + "authTypeRequired": "Please select an auth type", + "authTypePlaceholder": "Select auth type", + "authNone": "None", + "authApiKey": "API Key", + "authBearerToken": "Bearer Token", + "authToken": "Token", + "authBasic": "Basic Auth", + "authOauth": "OAuth", + "authAwsSigv4": "AWS SigV4 (Bedrock AgentCore MCPs)", + "authValueLabel": "Authentication Value", + "authValueTooltip": "Token, password, or header value to send with each request for the selected auth type.", + "authValueEmpty": "Authentication value cannot be empty whitespace", + "authValuePlaceholder": "Enter token or secret", + "awsSigv4Desc": "For MCP servers hosted on AWS Bedrock AgentCore. View docs", + "awsRegionLabel": "AWS Region", + "awsRegionTooltip": "AWS region for SigV4 signing (e.g., us-east-1)", + "awsRegionRequired": "AWS region is required for SigV4 auth", + "awsServiceNameLabel": "AWS Service Name", + "awsServiceNameTooltip": "AWS service name for SigV4 signing. Defaults to 'bedrock-agentcore'.", + "awsAccessKeyIdLabel": "AWS Access Key ID", + "awsAccessKeyIdTooltip": "Optional. If not provided, falls back to the boto3 credential chain (IAM role, env vars, etc.).", + "awsAccessKeyIdRequired": "Access Key ID is required when Secret Access Key is provided", + "awsAccessKeyIdPlaceholder": "AKIA... (optional — uses IAM role if blank)", + "awsSecretKeyLabel": "AWS Secret Access Key", + "awsSecretKeyTooltip": "Optional. Required if AWS Access Key ID is provided.", + "awsSecretKeyRequired": "Secret Access Key is required when Access Key ID is provided", + "awsSecretKeyPlaceholder": "Enter secret key (optional — uses IAM role if blank)", + "awsSessionTokenLabel": "AWS Session Token", + "awsSessionTokenTooltip": "Optional. Only needed for temporary STS credentials.", + "awsSessionTokenPlaceholder": "Enter session token (optional)", + "awsRoleArnLabel": "AWS Role ARN", + "awsRoleArnTooltip": "Optional. IAM role ARN to assume via STS before signing. If set, LiteLLM calls sts:AssumeRole to get temporary credentials. Uses ambient credentials (IAM role, env vars) as the source identity unless explicit keys are also provided.", + "awsRoleArnPlaceholder": "arn:aws:iam::123456789012:role/MyRole (optional)", + "awsSessionNameLabel": "AWS Session Name", + "awsSessionNameTooltip": "Optional. Session name for the AssumeRole call — appears in CloudTrail logs. Auto-generated if omitted.", + "awsSessionNamePlaceholder": "litellm-prod (optional, auto-generated if blank)", + "creating": "Creating...", + "addButton": "Add MCP Server" + }, "toolTestPanel": { "testToolTitle": "Test Tool:", "clickToCopyToolName": "Click to copy tool name", diff --git a/ui/litellm-dashboard/src/locales/zh-CN.json b/ui/litellm-dashboard/src/locales/zh-CN.json index f681ec8a7b9..fc6773f6c34 100644 --- a/ui/litellm-dashboard/src/locales/zh-CN.json +++ b/ui/litellm-dashboard/src/locales/zh-CN.json @@ -3326,6 +3326,100 @@ "required": "请输入 stdio 配置", "invalidJson": "请输入有效的 JSON" }, + "userEnvVarsModal": { + "title": "设置您的凭据", + "perUserTag": "按用户", + "loadError": "加载环境变量失败", + "noFieldsConfigured": "此服务器未配置按用户字段。", + "privacyNote": "这些值仅对您私有。您的管理员配置了此 MCP 服务器需要这些按用户凭据。已保存的值不会再次显示;已设置的字段留空表示保留原值,输入新值则覆盖。", + "setTag": "已设置", + "fieldRequired": "{{name}} 为必填项", + "overwritePlaceholder": "输入新值以覆盖", + "enterFieldPlaceholder": "输入您的 {{name}}", + "savedSuccess": "凭据已保存", + "saveFailed": "保存环境变量失败:{{error}}", + "saveButton": "保存凭据" + }, + "createMcpServer": { + "oauthAuthSuccess": "OAuth 授权成功!请点击「创建 MCP 服务器」保存配置。", + "invalidJsonStdio": "stdio 配置中的 JSON 无效", + "invalidJsonTokenValidation": "Token 验证规则中的 JSON 无效", + "createSuccess": "MCP 服务器创建成功", + "submitSuccess": "MCP 服务器已提交,待管理员审核", + "createFailed": "创建 MCP 服务器时出错:{{reason}}", + "submitFailed": "提交 MCP 服务器时出错:{{reason}}", + "createNewGroup": "创建新组", + "mcpLogoAlt": "MCP Logo", + "modalTitleAdmin": "添加新 MCP 服务器", + "modalTitleUser": "提交 MCP 服务器审核", + "nonAdminBanner": "您的提交将发送给管理员审核后才能生效。注意:请求必须使用团队范围的 API 密钥。", + "serverNameLabel": "MCP 服务器名称", + "serverNameTooltip": "最佳实践:使用描述性名称说明服务器用途(如 'GitHub_MCP'、'Email_Service')。不能包含空格或连字符,请使用下划线。名称须符合 SEP-986,无效名称将被拒绝。", + "serverNameRequired": "请输入服务器名称", + "serverNamePlaceholder": "例如:GitHub_MCP、Zapier_MCP 等", + "aliasLabel": "别名", + "aliasTooltip": "此服务器的简短唯一标识符。未提供时默认使用服务器名称。不能包含空格或连字符,请使用下划线。", + "descriptionRequired": "请输入服务器描述", + "descriptionPlaceholder": "简要描述此服务器的功能", + "sourceUrlLabel": "GitHub / 源码 URL", + "transportLabel": "传输类型", + "transportRequired": "请选择传输类型", + "transportPlaceholder": "选择传输类型", + "transportHttp": "Streamable HTTP(推荐)", + "transportSse": "Server-Sent Events (SSE)", + "transportStdio": "Standard Input/Output (stdio)", + "transportOpenapi": "OpenAPI Spec", + "serverUrlLabel": "MCP 服务器 URL", + "serverUrlRequired": "请输入服务器 URL", + "byokLabel": "BYOK(自带密钥)", + "byokTooltip": "启用后,每位用户为此服务提供自己的 API 密钥。密钥按用户存储,不共享。", + "byokKeysSentAs": "用户密钥发送格式:", + "byokSetAuthType": "请在下方设置认证类型,以指定用户密钥的发送方式(如 Bearer Token、API Key 请求头)。", + "byokAccessDescLabel": "访问描述", + "byokAccessDescTooltip": "在连接弹窗中向用户显示的权限列表(例如:'创建和管理 Jira 问题')", + "byokAccessDescPlaceholder": "添加访问描述项(每项后按回车)", + "byokApiKeyHelpUrlLabel": "API 密钥帮助 URL", + "byokApiKeyHelpUrlTooltip": "向用户显示的可选链接,帮助其找到 API 密钥", + "authLabel": "认证", + "authTypeRequired": "请选择认证类型", + "authTypePlaceholder": "选择认证类型", + "authNone": "无", + "authApiKey": "API Key", + "authBearerToken": "Bearer Token", + "authToken": "Token", + "authBasic": "Basic Auth", + "authOauth": "OAuth", + "authAwsSigv4": "AWS SigV4(Bedrock AgentCore MCPs)", + "authValueLabel": "认证值", + "authValueTooltip": "针对所选认证类型,随每次请求发送的 Token、密码或请求头值。", + "authValueEmpty": "认证值不能为纯空格", + "authValuePlaceholder": "输入 Token 或密钥", + "awsSigv4Desc": "适用于托管在 AWS Bedrock AgentCore 上的 MCP 服务器。查看文档", + "awsRegionLabel": "AWS 区域", + "awsRegionTooltip": "SigV4 签名使用的 AWS 区域(如 us-east-1)", + "awsRegionRequired": "SigV4 认证需要提供 AWS 区域", + "awsServiceNameLabel": "AWS 服务名称", + "awsServiceNameTooltip": "SigV4 签名使用的 AWS 服务名称,默认为 'bedrock-agentcore'。", + "awsAccessKeyIdLabel": "AWS Access Key ID", + "awsAccessKeyIdTooltip": "可选。若不提供,则回退到 boto3 凭据链(IAM 角色、环境变量等)。", + "awsAccessKeyIdRequired": "提供 Secret Access Key 时必须同时提供 Access Key ID", + "awsAccessKeyIdPlaceholder": "AKIA...(可选,留空使用 IAM 角色)", + "awsSecretKeyLabel": "AWS Secret Access Key", + "awsSecretKeyTooltip": "可选。提供 AWS Access Key ID 时必须填写。", + "awsSecretKeyRequired": "提供 Access Key ID 时必须同时提供 Secret Access Key", + "awsSecretKeyPlaceholder": "输入密钥(可选,留空使用 IAM 角色)", + "awsSessionTokenLabel": "AWS Session Token", + "awsSessionTokenTooltip": "可选。仅在使用临时 STS 凭据时需要。", + "awsSessionTokenPlaceholder": "输入 Session Token(可选)", + "awsRoleArnLabel": "AWS Role ARN", + "awsRoleArnTooltip": "可选。签名前通过 STS 代入的 IAM 角色 ARN。若设置,LiteLLM 将调用 sts:AssumeRole 获取临时凭据。除非同时提供了显式密钥,否则使用环境凭据(IAM 角色、环境变量)作为源身份。", + "awsRoleArnPlaceholder": "arn:aws:iam::123456789012:role/MyRole(可选)", + "awsSessionNameLabel": "AWS Session Name", + "awsSessionNameTooltip": "可选。AssumeRole 调用的会话名称,出现在 CloudTrail 日志中。若不填写则自动生成。", + "awsSessionNamePlaceholder": "litellm-prod(可选,留空自动生成)", + "creating": "创建中...", + "addButton": "添加 MCP 服务器" + }, "toolTestPanel": { "testToolTitle": "测试工具:", "clickToCopyToolName": "点击复制工具名称",