Skip to content

Commit 966f748

Browse files
committed
refactor(cli): dedupe MCP config sanitization
1 parent dd2cff9 commit 966f748

4 files changed

Lines changed: 34 additions & 60 deletions

File tree

crates/loopforge-cli/src/dispatch.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ mod doctor;
88
mod harness;
99
mod init;
1010
mod mcp;
11+
mod mcp_sanitize;
1112
mod release;
1213
mod session;
1314
mod skills;

crates/loopforge-cli/src/dispatch/mcp.rs

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use std::path::PathBuf;
44
use anyhow::{anyhow, Context};
55
use serde_json::Value;
66

7+
use super::mcp_sanitize::sanitize_mcp_config;
78
use crate::{cli::McpCommand, runtime_env};
89

910
pub(super) async fn run(command: McpCommand) -> anyhow::Result<()> {
@@ -185,36 +186,6 @@ fn list_remote_tool_names(tools: &rexos::tools::Toolset) -> Vec<String> {
185186
names
186187
}
187188

188-
fn sanitize_mcp_config(value: &Value) -> Value {
189-
match value {
190-
Value::Object(map) => {
191-
let mut out = serde_json::Map::new();
192-
for (k, v) in map {
193-
if k == "env" {
194-
match v.as_object() {
195-
Some(env) => {
196-
let mut redacted = serde_json::Map::new();
197-
for (ek, _ev) in env {
198-
redacted
199-
.insert(ek.clone(), Value::String("[redacted]".to_string()));
200-
}
201-
out.insert(k.clone(), Value::Object(redacted));
202-
}
203-
None => {
204-
out.insert(k.clone(), Value::String("[redacted]".to_string()));
205-
}
206-
}
207-
continue;
208-
}
209-
out.insert(k.clone(), sanitize_mcp_config(v));
210-
}
211-
Value::Object(out)
212-
}
213-
Value::Array(values) => Value::Array(values.iter().map(sanitize_mcp_config).collect()),
214-
other => other.clone(),
215-
}
216-
}
217-
218189
#[cfg(test)]
219190
mod tests {
220191
use super::*;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
use serde_json::Value;
2+
3+
pub(crate) fn sanitize_mcp_config(value: &Value) -> Value {
4+
match value {
5+
Value::Object(map) => {
6+
let mut out = serde_json::Map::new();
7+
for (k, v) in map {
8+
if k == "env" {
9+
match v.as_object() {
10+
Some(env) => {
11+
let mut redacted = serde_json::Map::new();
12+
for (ek, _ev) in env {
13+
redacted
14+
.insert(ek.clone(), Value::String("[redacted]".to_string()));
15+
}
16+
out.insert(k.clone(), Value::Object(redacted));
17+
}
18+
None => {
19+
out.insert(k.clone(), Value::String("[redacted]".to_string()));
20+
}
21+
}
22+
continue;
23+
}
24+
out.insert(k.clone(), sanitize_mcp_config(v));
25+
}
26+
Value::Object(out)
27+
}
28+
Value::Array(values) => Value::Array(values.iter().map(sanitize_mcp_config).collect()),
29+
other => other.clone(),
30+
}
31+
}

crates/loopforge-cli/src/dispatch/session.rs

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use std::collections::BTreeMap;
33
use anyhow::Context;
44
use serde_json::Value;
55

6+
use super::mcp_sanitize::sanitize_mcp_config;
67
use crate::{cli::SessionCommand, runtime_env};
78

89
pub(super) async fn run(command: SessionCommand) -> anyhow::Result<()> {
@@ -167,36 +168,6 @@ fn summarize_mcp_config(
167168
(servers, sanitized, None)
168169
}
169170

170-
fn sanitize_mcp_config(value: &Value) -> Value {
171-
match value {
172-
Value::Object(map) => {
173-
let mut out = serde_json::Map::new();
174-
for (k, v) in map {
175-
if k == "env" {
176-
match v.as_object() {
177-
Some(env) => {
178-
let mut redacted = serde_json::Map::new();
179-
for (ek, _ev) in env {
180-
redacted
181-
.insert(ek.clone(), Value::String("[redacted]".to_string()));
182-
}
183-
out.insert(k.clone(), Value::Object(redacted));
184-
}
185-
None => {
186-
out.insert(k.clone(), Value::String("[redacted]".to_string()));
187-
}
188-
}
189-
continue;
190-
}
191-
out.insert(k.clone(), sanitize_mcp_config(v));
192-
}
193-
Value::Object(out)
194-
}
195-
Value::Array(values) => Value::Array(values.iter().map(sanitize_mcp_config).collect()),
196-
other => other.clone(),
197-
}
198-
}
199-
200171
#[cfg(test)]
201172
mod tests {
202173
use super::*;

0 commit comments

Comments
 (0)