Skip to content

Commit d0e6caf

Browse files
committed
fix: preserve unmanaged MCode MCP servers during sync
1 parent dc4791a commit d0e6caf

2 files changed

Lines changed: 38 additions & 1 deletion

File tree

src-tauri/src/services/mcp.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,9 +243,11 @@ impl McpService {
243243
for server in servers.values() {
244244
if server.apps.is_enabled_for(app) {
245245
Self::sync_server_to_app(state, server, app)?;
246-
} else {
246+
} else if !matches!(app, AppType::Mcode) {
247247
Self::remove_server_from_app(state, &server.id, app)?;
248248
}
249+
// MCode's false flag also covers pre-existing, unmanaged servers.
250+
// Only explicit disable/delete operations may remove those entries.
249251
}
250252

251253
Ok(())

src-tauri/tests/mcp_commands.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,41 @@ use support::{
1515
create_test_state, create_test_state_with_config, ensure_test_home, reset_test_fs, test_mutex,
1616
};
1717

18+
#[test]
19+
fn mcode_automatic_sync_preserves_unmanaged_same_name_servers() {
20+
let _guard = test_mutex().lock().unwrap();
21+
reset_test_fs();
22+
let state = create_test_state().unwrap();
23+
let path = ensure_test_home().join(".minimax/mcp.json");
24+
fs::create_dir_all(path.parent().unwrap()).unwrap();
25+
let native = json!({"mcpServers":{"context7":{"command":"native-server","enabled":true}}});
26+
fs::write(&path, native.to_string()).unwrap();
27+
let server = McpServer {
28+
id: "context7".into(),
29+
name: "Context7".into(),
30+
server: json!({"command":"managed-server"}),
31+
apps: McpApps {
32+
claude: true,
33+
..Default::default()
34+
},
35+
description: None,
36+
homepage: None,
37+
docs: None,
38+
tags: vec![],
39+
};
40+
state.db.save_mcp_server(&server).unwrap();
41+
McpService::sync_enabled_for_app(&state, &AppType::Mcode).unwrap();
42+
assert_eq!(
43+
serde_json::from_str::<serde_json::Value>(&fs::read_to_string(&path).unwrap()).unwrap(),
44+
native
45+
);
46+
McpService::toggle_app(&state, "context7", AppType::Mcode, true).unwrap();
47+
McpService::toggle_app(&state, "context7", AppType::Mcode, false).unwrap();
48+
let disabled: serde_json::Value =
49+
serde_json::from_str(&fs::read_to_string(&path).unwrap()).unwrap();
50+
assert!(disabled["mcpServers"].get("context7").is_none());
51+
}
52+
1853
#[test]
1954
fn import_default_config_claude_persists_provider() {
2055
let _guard = test_mutex().lock().expect("acquire test mutex");

0 commit comments

Comments
 (0)