diff --git a/src-tauri/src/config.rs b/src-tauri/src/config.rs index 6cf9b23..23cc19a 100644 --- a/src-tauri/src/config.rs +++ b/src-tauri/src/config.rs @@ -40,6 +40,9 @@ pub struct ClaudeStartOptions { #[serde(default = "default_include_git_instructions")] pub include_git_instructions: bool, + + #[serde(default = "default_enable_claudeai_mcp_servers")] + pub enable_claudeai_mcp_servers: bool, } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -180,6 +183,9 @@ pub struct HikariConfig { #[serde(default = "default_include_git_instructions")] pub include_git_instructions: bool, + + #[serde(default = "default_enable_claudeai_mcp_servers")] + pub enable_claudeai_mcp_servers: bool, } impl Default for HikariConfig { @@ -228,6 +234,7 @@ impl Default for HikariConfig { task_loop_include_summary: false, disable_cron: false, include_git_instructions: true, + enable_claudeai_mcp_servers: true, } } } @@ -276,6 +283,10 @@ fn default_include_git_instructions() -> bool { true } +fn default_enable_claudeai_mcp_servers() -> bool { + true +} + #[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)] #[serde(rename_all = "lowercase")] pub enum BudgetAction { @@ -372,6 +383,7 @@ mod tests { assert!(!config.task_loop_include_summary); assert!(!config.disable_cron); assert!(config.include_git_instructions); + assert!(config.enable_claudeai_mcp_servers); } #[test] @@ -420,6 +432,7 @@ mod tests { task_loop_include_summary: true, disable_cron: true, include_git_instructions: false, + enable_claudeai_mcp_servers: false, }; let json = serde_json::to_string(&config).unwrap(); @@ -439,6 +452,7 @@ mod tests { assert!(deserialized.task_loop_include_summary); assert!(deserialized.disable_cron); assert!(!deserialized.include_git_instructions); + assert!(!deserialized.enable_claudeai_mcp_servers); } #[test] diff --git a/src-tauri/src/wsl_bridge.rs b/src-tauri/src/wsl_bridge.rs index 01807e7..d423e23 100644 --- a/src-tauri/src/wsl_bridge.rs +++ b/src-tauri/src/wsl_bridge.rs @@ -320,6 +320,11 @@ impl WslBridge { cmd.env("CLAUDE_CODE_DISABLE_GIT_INSTRUCTIONS", "1"); } + // Opt out of claude.ai MCP servers if requested + if !options.enable_claudeai_mcp_servers { + cmd.env("ENABLE_CLAUDEAI_MCP_SERVERS", "false"); + } + cmd } else { // Running on Windows - use wsl with bash login shell to ensure PATH is loaded @@ -382,6 +387,11 @@ impl WslBridge { claude_cmd.push_str("CLAUDE_CODE_DISABLE_GIT_INSTRUCTIONS=1 "); } + // Opt out of claude.ai MCP servers if requested + if !options.enable_claudeai_mcp_servers { + claude_cmd.push_str("ENABLE_CLAUDEAI_MCP_SERVERS=false "); + } + claude_cmd.push_str( "claude --output-format stream-json --input-format stream-json --verbose", ); diff --git a/src/lib/commands/slashCommands.test.ts b/src/lib/commands/slashCommands.test.ts index 46269e7..3f80d3e 100644 --- a/src/lib/commands/slashCommands.test.ts +++ b/src/lib/commands/slashCommands.test.ts @@ -66,6 +66,7 @@ vi.mock("$lib/stores/config", () => ({ disable_1m_context: false, max_output_tokens: null, include_git_instructions: true, + enable_claudeai_mcp_servers: true, }), }, })); diff --git a/src/lib/commands/slashCommands.ts b/src/lib/commands/slashCommands.ts index 05d4361..e5597a7 100644 --- a/src/lib/commands/slashCommands.ts +++ b/src/lib/commands/slashCommands.ts @@ -67,6 +67,7 @@ async function changeDirectory(path: string): Promise { disable_1m_context: config.disable_1m_context ?? false, max_output_tokens: config.max_output_tokens ?? null, include_git_instructions: config.include_git_instructions ?? true, + enable_claudeai_mcp_servers: config.enable_claudeai_mcp_servers ?? true, }, }); @@ -145,6 +146,7 @@ async function startNewConversation(): Promise { disable_1m_context: config.disable_1m_context ?? false, max_output_tokens: config.max_output_tokens ?? null, include_git_instructions: config.include_git_instructions ?? true, + enable_claudeai_mcp_servers: config.enable_claudeai_mcp_servers ?? true, }, }); diff --git a/src/lib/components/ConfigSidebar.svelte b/src/lib/components/ConfigSidebar.svelte index 4e56359..b939c33 100644 --- a/src/lib/components/ConfigSidebar.svelte +++ b/src/lib/components/ConfigSidebar.svelte @@ -60,6 +60,7 @@ disable_1m_context: false, disable_cron: false, include_git_instructions: true, + enable_claudeai_mcp_servers: true, max_output_tokens: null, trusted_workspaces: [], background_image_path: null, @@ -562,8 +563,8 @@ Disable cron scheduling

- Sets CLAUDE_CODE_DISABLE_CRON=1 to prevent Claude from - scheduling recurring tasks + Sets CLAUDE_CODE_DISABLE_CRON=1 to prevent Claude from scheduling + recurring tasks

@@ -658,6 +659,22 @@ class="w-full px-3 py-2 bg-[var(--bg-primary)] border border-[var(--border-color)] rounded-lg text-[var(--text-primary)] font-mono text-sm focus:outline-none focus:border-[var(--accent-primary)] resize-none" > + + +
+ +

+ When disabled, sets ENABLE_CLAUDEAI_MCP_SERVERS=false to prevent + Claude Code from connecting to MCP servers configured in Claude.ai. +

+
diff --git a/src/lib/components/InputBar.svelte b/src/lib/components/InputBar.svelte index 96ffa1b..ab79a3a 100644 --- a/src/lib/components/InputBar.svelte +++ b/src/lib/components/InputBar.svelte @@ -403,6 +403,7 @@ User: ${formattedMessage}`; use_worktree: config.use_worktree ?? false, disable_1m_context: config.disable_1m_context ?? false, include_git_instructions: config.include_git_instructions ?? true, + enable_claudeai_mcp_servers: config.enable_claudeai_mcp_servers ?? true, }, }); diff --git a/src/lib/components/PermissionModal.svelte b/src/lib/components/PermissionModal.svelte index d2728ee..c40bf90 100644 --- a/src/lib/components/PermissionModal.svelte +++ b/src/lib/components/PermissionModal.svelte @@ -90,6 +90,7 @@ use_worktree: config.use_worktree ?? false, disable_1m_context: config.disable_1m_context ?? false, include_git_instructions: config.include_git_instructions ?? true, + enable_claudeai_mcp_servers: config.enable_claudeai_mcp_servers ?? true, }, }); diff --git a/src/lib/components/StatusBar.svelte b/src/lib/components/StatusBar.svelte index bc8e376..fe96c34 100644 --- a/src/lib/components/StatusBar.svelte +++ b/src/lib/components/StatusBar.svelte @@ -88,6 +88,9 @@ task_loop_auto_commit: false, task_loop_commit_prefix: "feat", task_loop_include_summary: false, + disable_cron: false, + include_git_instructions: true, + enable_claudeai_mcp_servers: true, }); let streamerModeActive = $state(false); @@ -169,6 +172,7 @@ disable_1m_context: currentConfig.disable_1m_context ?? false, max_output_tokens: currentConfig.max_output_tokens ?? null, include_git_instructions: currentConfig.include_git_instructions ?? true, + enable_claudeai_mcp_servers: currentConfig.enable_claudeai_mcp_servers ?? true, }, }); @@ -327,6 +331,7 @@ disable_1m_context: currentConfig.disable_1m_context ?? false, max_output_tokens: currentConfig.max_output_tokens ?? null, include_git_instructions: currentConfig.include_git_instructions ?? true, + enable_claudeai_mcp_servers: currentConfig.enable_claudeai_mcp_servers ?? true, }, }); @@ -405,8 +410,12 @@ title="Worktree: {worktreeInfo.name} | Base: {worktreeInfo.original_repo_directory}" > - + {worktreeInfo.branch} diff --git a/src/lib/components/TaskLoopPanel.svelte b/src/lib/components/TaskLoopPanel.svelte index 60cd193..5a1b0a0 100644 --- a/src/lib/components/TaskLoopPanel.svelte +++ b/src/lib/components/TaskLoopPanel.svelte @@ -219,6 +219,7 @@ disable_1m_context: cfg.disable_1m_context ?? false, max_output_tokens: cfg.max_output_tokens ?? null, include_git_instructions: cfg.include_git_instructions ?? true, + enable_claudeai_mcp_servers: cfg.enable_claudeai_mcp_servers ?? true, }, }); } catch (error) { diff --git a/src/lib/components/UserQuestionModal.svelte b/src/lib/components/UserQuestionModal.svelte index 3ef6403..833d702 100644 --- a/src/lib/components/UserQuestionModal.svelte +++ b/src/lib/components/UserQuestionModal.svelte @@ -109,6 +109,7 @@ use_worktree: config.use_worktree ?? false, disable_1m_context: config.disable_1m_context ?? false, include_git_instructions: config.include_git_instructions ?? true, + enable_claudeai_mcp_servers: config.enable_claudeai_mcp_servers ?? true, }, }); diff --git a/src/lib/stores/config.test.ts b/src/lib/stores/config.test.ts index d375c77..9dad7b4 100644 --- a/src/lib/stores/config.test.ts +++ b/src/lib/stores/config.test.ts @@ -220,7 +220,9 @@ describe("config store", () => { task_loop_auto_commit: false, task_loop_commit_prefix: "feat", task_loop_include_summary: false, + disable_cron: false, include_git_instructions: true, + enable_claudeai_mcp_servers: true, }; expect(config.model).toBe("claude-sonnet-4"); @@ -280,7 +282,9 @@ describe("config store", () => { task_loop_auto_commit: false, task_loop_commit_prefix: "feat", task_loop_include_summary: false, + disable_cron: false, include_git_instructions: true, + enable_claudeai_mcp_servers: true, }; expect(config.model).toBeNull(); @@ -895,7 +899,9 @@ describe("config store", () => { task_loop_auto_commit: false, task_loop_commit_prefix: "feat", task_loop_include_summary: false, + disable_cron: false, include_git_instructions: true, + enable_claudeai_mcp_servers: true, }; const mockInvokeImpl = vi.mocked(invoke); diff --git a/src/lib/stores/config.ts b/src/lib/stores/config.ts index 2e93209..be203eb 100644 --- a/src/lib/stores/config.ts +++ b/src/lib/stores/config.ts @@ -81,8 +81,12 @@ export interface HikariConfig { task_loop_auto_commit: boolean; task_loop_commit_prefix: string; task_loop_include_summary: boolean; + // Disable cron scheduling + disable_cron: boolean; // Git instructions setting include_git_instructions: boolean; + // Claude.ai MCP servers setting + enable_claudeai_mcp_servers: boolean; } const defaultConfig: HikariConfig = { @@ -136,7 +140,9 @@ const defaultConfig: HikariConfig = { task_loop_auto_commit: false, task_loop_commit_prefix: "feat", task_loop_include_summary: false, + disable_cron: false, include_git_instructions: true, + enable_claudeai_mcp_servers: true, }; function createConfigStore() {