@@ -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