Skip to content

Commit a55ec50

Browse files
committed
store mcp_enabled in chatsession & conversationstate
1 parent 6c3ca50 commit a55ec50

File tree

7 files changed

+72
-36
lines changed

7 files changed

+72
-36
lines changed

crates/chat-cli/src/api_client/error.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ mod tests {
206206
response(),
207207
)),
208208
ApiClientError::GetProfileError(SdkError::service_error(
209-
ListAvailableModelsError::unhandled("<unhandled>"),
209+
GetProfileError::unhandled("<unhandled>"),
210210
response(),
211211
)),
212212
ApiClientError::ListAvailableModelsError(SdkError::service_error(

crates/chat-cli/src/cli/agent/mod.rs

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -408,16 +408,8 @@ impl Agents {
408408
agent_name: Option<&str>,
409409
skip_migration: bool,
410410
output: &mut impl Write,
411+
mcp_enabled: bool,
411412
) -> (Self, AgentsLoadMetadata) {
412-
// Check MCP governance at the very beginning
413-
let mcp_enabled = match os.client.is_mcp_enabled().await {
414-
Ok(enabled) => enabled,
415-
Err(err) => {
416-
tracing::warn!(?err, "Failed to check MCP configuration, defaulting to enabled");
417-
true
418-
},
419-
};
420-
421413
if !mcp_enabled {
422414
let _ = execute!(
423415
output,

crates/chat-cli/src/cli/agent/root_command_args.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,16 @@ pub struct AgentArgs {
7474
impl AgentArgs {
7575
pub async fn execute(self, os: &mut Os) -> Result<ExitCode> {
7676
let mut stderr = std::io::stderr();
77+
let mcp_enabled = match os.client.is_mcp_enabled().await {
78+
Ok(enabled) => enabled,
79+
Err(err) => {
80+
tracing::warn!(?err, "Failed to check MCP configuration, defaulting to enabled");
81+
true
82+
},
83+
};
7784
match self.cmd {
7885
Some(AgentSubcommands::List) | None => {
79-
let agents = Agents::load(os, None, true, &mut stderr).await.0;
86+
let agents = Agents::load(os, None, true, &mut stderr, mcp_enabled).await.0;
8087
let agent_with_path =
8188
agents
8289
.agents
@@ -101,7 +108,7 @@ impl AgentArgs {
101108
writeln!(stderr, "{}", output_str)?;
102109
},
103110
Some(AgentSubcommands::Create { name, directory, from }) => {
104-
let mut agents = Agents::load(os, None, true, &mut stderr).await.0;
111+
let mut agents = Agents::load(os, None, true, &mut stderr, mcp_enabled).await.0;
105112
let path_with_file_name = create_agent(os, &mut agents, name.clone(), directory, from).await?;
106113
let editor_cmd = std::env::var("EDITOR").unwrap_or_else(|_| "vi".to_string());
107114
let mut cmd = std::process::Command::new(editor_cmd);
@@ -133,13 +140,6 @@ impl AgentArgs {
133140
},
134141
Some(AgentSubcommands::Validate { path }) => {
135142
let mut global_mcp_config = None::<McpServerConfig>;
136-
let mcp_enabled = match os.client.is_mcp_enabled().await {
137-
Ok(enabled) => enabled,
138-
Err(err) => {
139-
tracing::warn!(?err, "Failed to check MCP configuration, defaulting to enabled");
140-
true
141-
},
142-
};
143143
let agent = Agent::load(os, path.as_str(), &mut global_mcp_config, mcp_enabled).await;
144144

145145
'validate: {
@@ -258,7 +258,7 @@ impl AgentArgs {
258258
}
259259
},
260260
Some(AgentSubcommands::SetDefault { name }) => {
261-
let mut agents = Agents::load(os, None, true, &mut stderr).await.0;
261+
let mut agents = Agents::load(os, None, true, &mut stderr, mcp_enabled).await.0;
262262
match agents.switch(&name) {
263263
Ok(agent) => {
264264
os.database

crates/chat-cli/src/cli/chat/cli/profile.rs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,9 @@ impl AgentSubcommand {
132132
.map_err(|e| ChatError::Custom(format!("Error printing agent schema: {e}").into()))?;
133133
},
134134
Self::Create { name, directory, from } => {
135-
let mut agents = Agents::load(os, None, true, &mut session.stderr).await.0;
135+
let mut agents = Agents::load(os, None, true, &mut session.stderr, session.conversation.mcp_enabled)
136+
.await
137+
.0;
136138
let path_with_file_name = create_agent(os, &mut agents, name.clone(), directory, from)
137139
.await
138140
.map_err(|e| ChatError::Custom(Cow::Owned(e.to_string())))?;
@@ -144,15 +146,8 @@ impl AgentSubcommand {
144146
return Err(ChatError::Custom("Editor process did not exit with success".into()));
145147
}
146148

147-
let mcp_enabled = match os.client.is_mcp_enabled().await {
148-
Ok(enabled) => enabled,
149-
Err(err) => {
150-
tracing::warn!(?err, "Failed to check MCP configuration, defaulting to enabled");
151-
true
152-
},
153-
};
154-
155-
let new_agent = Agent::load(os, &path_with_file_name, &mut None, mcp_enabled).await;
149+
let new_agent =
150+
Agent::load(os, &path_with_file_name, &mut None, session.conversation.mcp_enabled).await;
156151
match new_agent {
157152
Ok(agent) => {
158153
session.conversation.agents.agents.insert(agent.name.clone(), agent);

crates/chat-cli/src/cli/chat/conversation.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ pub struct ConversationState {
124124
/// Maps from a file path to [FileLineTracker]
125125
#[serde(default)]
126126
pub file_line_tracker: HashMap<String, FileLineTracker>,
127+
#[serde(default = "default_true")]
128+
pub mcp_enabled: bool,
127129
}
128130

129131
impl ConversationState {
@@ -134,6 +136,7 @@ impl ConversationState {
134136
tool_manager: ToolManager,
135137
current_model_id: Option<String>,
136138
os: &Os,
139+
mcp_enabled: bool,
137140
) -> Self {
138141
let model = if let Some(model_id) = current_model_id {
139142
match get_model_info(&model_id, os).await {
@@ -180,6 +183,7 @@ impl ConversationState {
180183
model: None,
181184
model_info: model,
182185
file_line_tracker: HashMap::new(),
186+
mcp_enabled,
183187
}
184188
}
185189

@@ -1006,6 +1010,9 @@ fn enforce_tool_use_history_invariants(history: &mut VecDeque<HistoryEntry>, too
10061010
}
10071011
}
10081012

1013+
fn default_true() -> bool {
1014+
true
1015+
}
10091016
#[cfg(test)]
10101017
mod tests {
10111018
use super::super::message::AssistantToolUse;
@@ -1124,6 +1131,7 @@ mod tests {
11241131
tool_manager,
11251132
None,
11261133
&os,
1134+
false,
11271135
)
11281136
.await;
11291137

@@ -1156,6 +1164,7 @@ mod tests {
11561164
tool_manager.clone(),
11571165
None,
11581166
&os,
1167+
false,
11591168
)
11601169
.await;
11611170
conversation.set_next_user_message("start".to_string()).await;
@@ -1191,6 +1200,7 @@ mod tests {
11911200
tool_manager.clone(),
11921201
None,
11931202
&os,
1203+
false,
11941204
)
11951205
.await;
11961206
conversation.set_next_user_message("start".to_string()).await;
@@ -1245,6 +1255,7 @@ mod tests {
12451255
tool_manager,
12461256
None,
12471257
&os,
1258+
false,
12481259
)
12491260
.await;
12501261

crates/chat-cli/src/cli/chat/mod.rs

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -251,9 +251,19 @@ impl ChatArgs {
251251
let conversation_id = uuid::Uuid::new_v4().to_string();
252252
info!(?conversation_id, "Generated new conversation id");
253253

254+
// Check MCP status once at the beginning of the session
255+
let mcp_enabled = match os.client.is_mcp_enabled().await {
256+
Ok(enabled) => enabled,
257+
Err(err) => {
258+
tracing::warn!(?err, "Failed to check MCP configuration, defaulting to enabled");
259+
true
260+
},
261+
};
262+
254263
let agents = {
255264
let skip_migration = self.no_interactive;
256-
let (mut agents, md) = Agents::load(os, self.agent.as_deref(), skip_migration, &mut stderr).await;
265+
let (mut agents, md) =
266+
Agents::load(os, self.agent.as_deref(), skip_migration, &mut stderr, mcp_enabled).await;
257267
agents.trust_all_tools = self.trust_all_tools;
258268

259269
os.telemetry
@@ -268,9 +278,11 @@ impl ChatArgs {
268278
.map_err(|err| error!(?err, "failed to send agent config init telemetry"))
269279
.ok();
270280

271-
if agents
272-
.get_active()
273-
.is_some_and(|a| !a.mcp_servers.mcp_servers.is_empty())
281+
// Only show MCP safety message if MCP is enabled and has servers
282+
if mcp_enabled
283+
&& agents
284+
.get_active()
285+
.is_some_and(|a| !a.mcp_servers.mcp_servers.is_empty())
274286
{
275287
if !self.no_interactive && !os.database.settings.get_bool(Setting::McpLoadedBefore).unwrap_or(false) {
276288
execute!(
@@ -364,6 +376,7 @@ impl ChatArgs {
364376
model_id,
365377
tool_config,
366378
!self.no_interactive,
379+
mcp_enabled,
367380
)
368381
.await?
369382
.spawn(os)
@@ -589,6 +602,7 @@ impl ChatSession {
589602
model_id: Option<String>,
590603
tool_config: HashMap<String, ToolSpec>,
591604
interactive: bool,
605+
mcp_enabled: bool,
592606
) -> Result<Self> {
593607
// Reload prior conversation
594608
let mut existing_conversation = false;
@@ -624,11 +638,23 @@ impl ChatSession {
624638
}
625639
}
626640
cs.agents = agents;
641+
cs.mcp_enabled = mcp_enabled;
627642
cs.update_state(true).await;
628643
cs.enforce_tool_use_history_invariants();
629644
cs
630645
},
631-
false => ConversationState::new(conversation_id, agents, tool_config, tool_manager, model_id, os).await,
646+
false => {
647+
ConversationState::new(
648+
conversation_id,
649+
agents,
650+
tool_config,
651+
tool_manager,
652+
model_id,
653+
os,
654+
mcp_enabled,
655+
)
656+
.await
657+
},
632658
};
633659

634660
// Spawn a task for listening and broadcasting sigints.
@@ -2967,6 +2993,7 @@ mod tests {
29672993
None,
29682994
tool_config,
29692995
true,
2996+
false,
29702997
)
29712998
.await
29722999
.unwrap()
@@ -3108,6 +3135,7 @@ mod tests {
31083135
None,
31093136
tool_config,
31103137
true,
3138+
false,
31113139
)
31123140
.await
31133141
.unwrap()
@@ -3204,6 +3232,7 @@ mod tests {
32043232
None,
32053233
tool_config,
32063234
true,
3235+
false,
32073236
)
32083237
.await
32093238
.unwrap()
@@ -3278,6 +3307,7 @@ mod tests {
32783307
None,
32793308
tool_config,
32803309
true,
3310+
false,
32813311
)
32823312
.await
32833313
.unwrap()
@@ -3328,6 +3358,7 @@ mod tests {
33283358
None,
33293359
tool_config,
33303360
true,
3361+
false,
33313362
)
33323363
.await
33333364
.unwrap()

crates/chat-cli/src/cli/mcp.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,14 @@ impl StatusArgs {
416416
async fn get_mcp_server_configs(os: &mut Os) -> Result<BTreeMap<Scope, Vec<(String, Option<McpServerConfig>, bool)>>> {
417417
let mut results = BTreeMap::new();
418418
let mut stderr = std::io::stderr();
419-
let agents = Agents::load(os, None, true, &mut stderr).await.0;
419+
let mcp_enabled = match os.client.is_mcp_enabled().await {
420+
Ok(enabled) => enabled,
421+
Err(err) => {
422+
tracing::warn!(?err, "Failed to check MCP configuration, defaulting to enabled");
423+
true
424+
},
425+
};
426+
let agents = Agents::load(os, None, true, &mut stderr, mcp_enabled).await.0;
420427
let global_path = directories::chat_global_agent_path(os)?;
421428
for (_, agent) in agents.agents {
422429
let scope = if agent

0 commit comments

Comments
 (0)