Validate remote MCP URLs in config UI
This commit is contained in:
parent
bc8c08d930
commit
7c989ce26c
4 changed files with 73 additions and 0 deletions
|
|
@ -338,6 +338,20 @@ export function ConfigPage() {
|
|||
throw new Error(`MCP server ${server.name} requires a URL.`)
|
||||
}
|
||||
|
||||
try {
|
||||
const parsedURL = new URL(server.url)
|
||||
if (
|
||||
parsedURL.protocol !== "http:" &&
|
||||
parsedURL.protocol !== "https:"
|
||||
) {
|
||||
throw new Error("invalid protocol")
|
||||
}
|
||||
} catch {
|
||||
throw new Error(
|
||||
`MCP server ${server.name} requires a valid HTTP(S) URL.`,
|
||||
)
|
||||
}
|
||||
|
||||
return [
|
||||
server.name,
|
||||
{
|
||||
|
|
|
|||
|
|
@ -399,6 +399,42 @@ export function MCPSection({
|
|||
onServerFieldChange(server.id, "enabled", checked)
|
||||
}
|
||||
/>
|
||||
|
||||
<Select
|
||||
value={
|
||||
server.deferredOverride === null
|
||||
? "inherit"
|
||||
: server.deferredOverride
|
||||
? "deferred"
|
||||
: "eager"
|
||||
}
|
||||
onValueChange={(value) =>
|
||||
onServerFieldChange(
|
||||
server.id,
|
||||
"deferredOverride",
|
||||
value === "inherit" ? null : value === "deferred",
|
||||
)
|
||||
}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue
|
||||
placeholder={t(
|
||||
"pages.config.mcp_server_discovery_mode",
|
||||
)}
|
||||
/>
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectItem value="inherit">
|
||||
{t("pages.config.mcp_server_discovery_mode_inherit")}
|
||||
</SelectItem>
|
||||
<SelectItem value="deferred">
|
||||
{t("pages.config.mcp_server_discovery_mode_deferred")}
|
||||
</SelectItem>
|
||||
<SelectItem value="eager">
|
||||
{t("pages.config.mcp_server_discovery_mode_eager")}
|
||||
</SelectItem>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
|
||||
{server.type !== "stdio" ? (
|
||||
|
|
@ -442,6 +478,19 @@ export function MCPSection({
|
|||
)
|
||||
}
|
||||
/>
|
||||
<Input
|
||||
value={server.envFile}
|
||||
placeholder={t(
|
||||
"pages.config.mcp_server_env_file_placeholder",
|
||||
)}
|
||||
onChange={(e) =>
|
||||
onServerFieldChange(
|
||||
server.id,
|
||||
"envFile",
|
||||
e.target.value,
|
||||
)
|
||||
}
|
||||
/>
|
||||
<Textarea
|
||||
value={server.argsText}
|
||||
placeholder={t(
|
||||
|
|
|
|||
|
|
@ -720,9 +720,14 @@
|
|||
"mcp_server_add": "Add server",
|
||||
"mcp_server_remove": "Remove",
|
||||
"mcp_server_enabled": "Enabled",
|
||||
"mcp_server_discovery_mode": "Discovery mode",
|
||||
"mcp_server_discovery_mode_inherit": "Follow global discovery mode",
|
||||
"mcp_server_discovery_mode_deferred": "Deferred discovery",
|
||||
"mcp_server_discovery_mode_eager": "Eager registration",
|
||||
"mcp_server_name_placeholder": "Server name (e.g. github)",
|
||||
"mcp_server_url_placeholder": "Server URL (e.g. https://example.com/mcp)",
|
||||
"mcp_server_command_placeholder": "Command (e.g. npx)",
|
||||
"mcp_server_env_file_placeholder": "Environment file path (optional)",
|
||||
"mcp_server_args_placeholder": "Args, one per line",
|
||||
"mcp_server_env_placeholder": "Environment JSON object",
|
||||
"mcp_server_headers_placeholder": "Headers JSON object",
|
||||
|
|
|
|||
|
|
@ -720,9 +720,14 @@
|
|||
"mcp_server_add": "添加服务器",
|
||||
"mcp_server_remove": "移除",
|
||||
"mcp_server_enabled": "已启用",
|
||||
"mcp_server_discovery_mode": "发现模式",
|
||||
"mcp_server_discovery_mode_inherit": "跟随全局发现模式",
|
||||
"mcp_server_discovery_mode_deferred": "延迟发现",
|
||||
"mcp_server_discovery_mode_eager": "立即注册",
|
||||
"mcp_server_name_placeholder": "服务器名称(例如 github)",
|
||||
"mcp_server_url_placeholder": "服务器 URL(例如 https://example.com/mcp)",
|
||||
"mcp_server_command_placeholder": "命令(例如 npx)",
|
||||
"mcp_server_env_file_placeholder": "环境变量文件路径(可选)",
|
||||
"mcp_server_args_placeholder": "参数(每行一个)",
|
||||
"mcp_server_env_placeholder": "环境变量 JSON 对象",
|
||||
"mcp_server_headers_placeholder": "请求头 JSON 对象",
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue