fix(mcp): remove SSE support; keep stdio default when type is omitted

- Backend: reject "sse" in validators; accept missing type as stdio; require url only for http (mcp.rs, claude_mcp.rs)
- Frontend: McpServer.type narrowed to "stdio" | "http" (optional) (src/types.ts)
- UI: avoid undefined in list item details (McpListItem)
- Claude-only sync after delete to update ~/.claude.json (commands.rs)

Notes:
- Ran typecheck and cargo check: both pass
- Clippy shows advisory warnings unrelated to this change
- Prettier check warns on a few files; limited scope changes kept minimal
This commit is contained in:
Jason
2025-10-09 22:02:56 +08:00
parent f6bf8611cd
commit 511980e3ea
9 changed files with 152 additions and 71 deletions

View File

@@ -30,9 +30,9 @@ const McpListItem: React.FC<McpListItemProps> = ({
const enabled = server.enabled !== false;
// 构建详细信息文本
const details = [server.type, server.command, ...(server.args || [])].join(
" · ",
);
const details = ([server.type, server.command, ...(server.args || [])]
.filter(Boolean) as string[])
.join(" · ");
return (
<div className={cn(cardStyles.interactive, "!p-4")}>

View File

@@ -40,7 +40,7 @@ const McpPanel: React.FC<McpPanelProps> = ({ onClose, onNotify }) => {
const reload = async () => {
setLoading(true);
try {
const cfg = await window.api.getMcpConfig();
const cfg = await window.api.getMcpConfig("claude");
setStatus({
userConfigPath: cfg.configPath,
userConfigExists: true,
@@ -59,7 +59,7 @@ const McpPanel: React.FC<McpPanelProps> = ({ onClose, onNotify }) => {
await window.api.importMcpFromClaude();
// 读取现有 config.json 内容
const cfg = await window.api.getMcpConfig();
const cfg = await window.api.getMcpConfig("claude");
const existing = cfg.servers || {};
// 将预设落库为禁用(若缺失)
@@ -70,7 +70,7 @@ const McpPanel: React.FC<McpPanelProps> = ({ onClose, onNotify }) => {
enabled: false,
source: "preset",
} as unknown as McpServer;
await window.api.upsertMcpServerInConfig(p.id, seed);
await window.api.upsertMcpServerInConfig("claude", p.id, seed);
}
} catch (e) {
console.warn("MCP 初始化导入/落库失败(忽略继续)", e);
@@ -87,9 +87,9 @@ const McpPanel: React.FC<McpPanelProps> = ({ onClose, onNotify }) => {
if (!server) {
const preset = mcpPresets.find((p) => p.id === id);
if (!preset) return;
await window.api.upsertMcpServerInConfig(id, preset.server as McpServer);
await window.api.upsertMcpServerInConfig("claude", id, preset.server as McpServer);
}
await window.api.setMcpEnabled(id, enabled);
await window.api.setMcpEnabled("claude", id, enabled);
await reload();
onNotify?.(
enabled ? t("mcp.msg.enabled") : t("mcp.msg.disabled"),
@@ -123,7 +123,7 @@ const McpPanel: React.FC<McpPanelProps> = ({ onClose, onNotify }) => {
message: t("mcp.confirm.deleteMessage", { id }),
onConfirm: async () => {
try {
await window.api.deleteMcpServerInConfig(id);
await window.api.deleteMcpServerInConfig("claude", id);
await reload();
setConfirmDialog(null);
onNotify?.(t("mcp.msg.deleted"), "success", 1500);
@@ -141,7 +141,7 @@ const McpPanel: React.FC<McpPanelProps> = ({ onClose, onNotify }) => {
const handleSave = async (id: string, server: McpServer) => {
try {
await window.api.upsertMcpServerInConfig(id, server);
await window.api.upsertMcpServerInConfig("claude", id, server);
await reload();
setIsFormOpen(false);
setEditingId(null);