Skip to content

Commit a7f457f

Browse files
committed
feat(core): update MCP auth and auto-review handling
1 parent 93c8c99 commit a7f457f

13 files changed

Lines changed: 1242 additions & 127 deletions

File tree

code-rs/app-server-protocol/schema/typescript/MacOsAutomationValue.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
44

5-
export type McpElicitationBooleanType = "boolean";
5+
export type MacOsAutomationValue = boolean | Array<string>;

code-rs/app-server-protocol/schema/typescript/MacOsPreferencesValue.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
44

5-
export type McpElicitationArrayType = "array";
5+
export type MacOsPreferencesValue = boolean | string;

code-rs/cli/src/mcp_cmd.rs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ fn build_mcp_transport_for_add(
130130
return Ok(McpServerTransportConfig::StreamableHttp {
131131
url,
132132
bearer_token: Some(bearer_token),
133+
bearer_token_env_var: None,
134+
http_headers: None,
135+
env_http_headers: None,
133136
oauth_resource: None,
134137
});
135138
}
@@ -242,6 +245,9 @@ mod tests {
242245
McpServerTransportConfig::StreamableHttp {
243246
url,
244247
bearer_token,
248+
bearer_token_env_var: _,
249+
http_headers: _,
250+
env_http_headers: _,
245251
oauth_resource,
246252
} => {
247253
assert_eq!(url, "https://mcp.example.com/mcp");
@@ -302,12 +308,18 @@ fn run_list(config_overrides: &CliConfigOverrides, list_args: ListArgs) -> Resul
302308
McpServerTransportConfig::StreamableHttp {
303309
url,
304310
bearer_token,
311+
bearer_token_env_var,
312+
http_headers,
313+
env_http_headers,
305314
oauth_resource,
306315
} => {
307316
serde_json::json!({
308317
"type": "streamable_http",
309318
"url": url,
310319
"bearer_token": bearer_token,
320+
"bearer_token_env_var": bearer_token_env_var,
321+
"http_headers": http_headers,
322+
"env_http_headers": env_http_headers,
311323
"oauth_resource": oauth_resource,
312324
})
313325
}
@@ -360,13 +372,17 @@ fn run_list(config_overrides: &CliConfigOverrides, list_args: ListArgs) -> Resul
360372
McpServerTransportConfig::StreamableHttp {
361373
url,
362374
bearer_token,
375+
bearer_token_env_var,
376+
http_headers,
377+
env_http_headers,
363378
oauth_resource: _,
364379
} => {
365-
let has_bearer = if bearer_token.is_some() {
380+
let has_bearer = if bearer_token.is_some() || bearer_token_env_var.is_some() {
366381
"True"
367382
} else {
368383
"False"
369384
};
385+
let _ = (http_headers, env_http_headers);
370386
http_rows.push([name.clone(), url.clone(), has_bearer.into()]);
371387
}
372388
}
@@ -465,11 +481,17 @@ fn run_get(config_overrides: &CliConfigOverrides, get_args: GetArgs) -> Result<(
465481
McpServerTransportConfig::StreamableHttp {
466482
url,
467483
bearer_token,
484+
bearer_token_env_var,
485+
http_headers,
486+
env_http_headers,
468487
oauth_resource,
469488
} => serde_json::json!({
470489
"type": "streamable_http",
471490
"url": url,
472491
"bearer_token": bearer_token,
492+
"bearer_token_env_var": bearer_token_env_var,
493+
"http_headers": http_headers,
494+
"env_http_headers": env_http_headers,
473495
"oauth_resource": oauth_resource,
474496
}),
475497
};
@@ -512,15 +534,25 @@ fn run_get(config_overrides: &CliConfigOverrides, get_args: GetArgs) -> Result<(
512534
McpServerTransportConfig::StreamableHttp {
513535
url,
514536
bearer_token,
537+
bearer_token_env_var,
538+
http_headers,
539+
env_http_headers,
515540
oauth_resource,
516541
} => {
517542
println!(" transport: streamable_http");
518543
println!(" url: {url}");
519544
let token_display = bearer_token
520545
.as_ref()
521546
.map(|_| "<redacted>".to_string())
547+
.or_else(|| bearer_token_env_var.as_ref().map(|value| format!("env:{value}")))
522548
.unwrap_or_else(|| "-".to_string());
523549
println!(" bearer_token: {token_display}");
550+
if let Some(headers) = http_headers {
551+
println!(" http_headers: {}", serde_json::to_string(headers)?);
552+
}
553+
if let Some(headers) = env_http_headers {
554+
println!(" env_http_headers: {}", serde_json::to_string(headers)?);
555+
}
524556
let resource_display = oauth_resource
525557
.clone()
526558
.unwrap_or_else(|| "-".to_string());

code-rs/core/src/config/sources.rs

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,12 +114,42 @@ pub fn write_global_mcp_servers(
114114
McpServerTransportConfig::StreamableHttp {
115115
url,
116116
bearer_token,
117+
bearer_token_env_var,
118+
http_headers,
119+
env_http_headers,
117120
oauth_resource,
118121
} => {
119122
entry["url"] = toml_edit::value(url.clone());
120123
if let Some(token) = bearer_token {
121124
entry["bearer_token"] = toml_edit::value(token.clone());
122125
}
126+
if let Some(token_env_var) = bearer_token_env_var {
127+
entry["bearer_token_env_var"] = toml_edit::value(token_env_var.clone());
128+
}
129+
if let Some(headers) = http_headers
130+
&& !headers.is_empty()
131+
{
132+
let mut headers_table = TomlTable::new();
133+
headers_table.set_implicit(false);
134+
let mut pairs: Vec<_> = headers.iter().collect();
135+
pairs.sort_by(|(a, _), (b, _)| a.cmp(b));
136+
for (key, value) in pairs {
137+
headers_table.insert(key, toml_edit::value(value.clone()));
138+
}
139+
entry["http_headers"] = TomlItem::Table(headers_table);
140+
}
141+
if let Some(headers) = env_http_headers
142+
&& !headers.is_empty()
143+
{
144+
let mut headers_table = TomlTable::new();
145+
headers_table.set_implicit(false);
146+
let mut pairs: Vec<_> = headers.iter().collect();
147+
pairs.sort_by(|(a, _), (b, _)| a.cmp(b));
148+
for (key, value) in pairs {
149+
headers_table.insert(key, toml_edit::value(value.clone()));
150+
}
151+
entry["env_http_headers"] = TomlItem::Table(headers_table);
152+
}
123153
if let Some(resource) = oauth_resource {
124154
entry["oauth_resource"] = toml_edit::value(resource.clone());
125155
}
@@ -1291,6 +1321,56 @@ pub fn list_mcp_servers(code_home: &Path) -> anyhow::Result<(
12911321
.get("bearer_token")
12921322
.and_then(|v| v.as_str())
12931323
.map(|s| s.to_string());
1324+
let bearer_token_env_var = t
1325+
.get("bearer_token_env_var")
1326+
.and_then(|v| v.as_str())
1327+
.map(|s| s.to_string());
1328+
let http_headers = t.get("http_headers").and_then(|v| {
1329+
v.as_table()
1330+
.map(|table| {
1331+
table
1332+
.iter()
1333+
.filter_map(|(key, value)| {
1334+
value.as_str().map(|value| (key.to_string(), value.to_string()))
1335+
})
1336+
.collect::<HashMap<_, _>>()
1337+
})
1338+
.or_else(|| {
1339+
v.as_inline_table().map(|table| {
1340+
table
1341+
.iter()
1342+
.filter_map(|(key, value)| {
1343+
value
1344+
.as_str()
1345+
.map(|value| (key.to_string(), value.to_string()))
1346+
})
1347+
.collect::<HashMap<_, _>>()
1348+
})
1349+
})
1350+
});
1351+
let env_http_headers = t.get("env_http_headers").and_then(|v| {
1352+
v.as_table()
1353+
.map(|table| {
1354+
table
1355+
.iter()
1356+
.filter_map(|(key, value)| {
1357+
value.as_str().map(|value| (key.to_string(), value.to_string()))
1358+
})
1359+
.collect::<HashMap<_, _>>()
1360+
})
1361+
.or_else(|| {
1362+
v.as_inline_table().map(|table| {
1363+
table
1364+
.iter()
1365+
.filter_map(|(key, value)| {
1366+
value
1367+
.as_str()
1368+
.map(|value| (key.to_string(), value.to_string()))
1369+
})
1370+
.collect::<HashMap<_, _>>()
1371+
})
1372+
})
1373+
});
12941374
let oauth_resource = t
12951375
.get("oauth_resource")
12961376
.and_then(|v| v.as_str())
@@ -1299,6 +1379,9 @@ pub fn list_mcp_servers(code_home: &Path) -> anyhow::Result<(
12991379
McpServerTransportConfig::StreamableHttp {
13001380
url: url.to_string(),
13011381
bearer_token,
1382+
bearer_token_env_var,
1383+
http_headers,
1384+
env_http_headers,
13021385
oauth_resource,
13031386
}
13041387
} else {
@@ -1420,12 +1503,35 @@ pub fn add_mcp_server(
14201503
McpServerTransportConfig::StreamableHttp {
14211504
url,
14221505
bearer_token,
1506+
bearer_token_env_var,
1507+
http_headers,
1508+
env_http_headers,
14231509
oauth_resource,
14241510
} => {
14251511
server_tbl.insert("url", toml_edit::value(url));
14261512
if let Some(token) = bearer_token {
14271513
server_tbl.insert("bearer_token", toml_edit::value(token));
14281514
}
1515+
if let Some(token_env_var) = bearer_token_env_var {
1516+
server_tbl.insert("bearer_token_env_var", toml_edit::value(token_env_var));
1517+
}
1518+
if let Some(headers) = http_headers {
1519+
let mut it = toml_edit::InlineTable::new();
1520+
for (k, v) in headers {
1521+
it.insert(&k, toml_edit::Value::from(v));
1522+
}
1523+
server_tbl.insert("http_headers", TomlItem::Value(toml_edit::Value::InlineTable(it)));
1524+
}
1525+
if let Some(headers) = env_http_headers {
1526+
let mut it = toml_edit::InlineTable::new();
1527+
for (k, v) in headers {
1528+
it.insert(&k, toml_edit::Value::from(v));
1529+
}
1530+
server_tbl.insert(
1531+
"env_http_headers",
1532+
TomlItem::Value(toml_edit::Value::InlineTable(it)),
1533+
);
1534+
}
14291535
if let Some(resource) = oauth_resource {
14301536
server_tbl.insert("oauth_resource", toml_edit::value(resource));
14311537
}

0 commit comments

Comments
 (0)