fix(codex): use http_headers instead of headers in MCP config (#276)
Codex CLI expects the field name to be `http_headers` (not `headers`) in the MCP server configuration TOML format. Changes: - Update import_from_codex() to read from both `http_headers` (correct) and `headers` (legacy) with priority to `http_headers` - Update json_server_to_toml_table() to write `http_headers` instead of `headers` - Update core_fields lists to use `http_headers` for HTTP/SSE types This follows the same pattern as the recent Gemini fix and ensures backward compatibility while generating correct Codex-compatible configs.
This commit is contained in:
@@ -449,7 +449,7 @@ pub fn import_from_codex(config: &mut MultiAppConfig) -> Result<usize, AppError>
|
|||||||
// 核心字段(需要手动处理的字段)
|
// 核心字段(需要手动处理的字段)
|
||||||
let core_fields = match typ {
|
let core_fields = match typ {
|
||||||
"stdio" => vec!["type", "command", "args", "env", "cwd"],
|
"stdio" => vec!["type", "command", "args", "env", "cwd"],
|
||||||
"http" | "sse" => vec!["type", "url", "headers"],
|
"http" | "sse" => vec!["type", "url", "http_headers"],
|
||||||
_ => vec!["type"],
|
_ => vec!["type"],
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -490,7 +490,13 @@ pub fn import_from_codex(config: &mut MultiAppConfig) -> Result<usize, AppError>
|
|||||||
if let Some(url) = entry_tbl.get("url").and_then(|v| v.as_str()) {
|
if let Some(url) = entry_tbl.get("url").and_then(|v| v.as_str()) {
|
||||||
spec.insert("url".into(), json!(url));
|
spec.insert("url".into(), json!(url));
|
||||||
}
|
}
|
||||||
if let Some(headers_tbl) = entry_tbl.get("headers").and_then(|v| v.as_table()) {
|
// Read from http_headers (correct Codex format) or headers (legacy) with priority to http_headers
|
||||||
|
let headers_tbl = entry_tbl
|
||||||
|
.get("http_headers")
|
||||||
|
.and_then(|v| v.as_table())
|
||||||
|
.or_else(|| entry_tbl.get("headers").and_then(|v| v.as_table()));
|
||||||
|
|
||||||
|
if let Some(headers_tbl) = headers_tbl {
|
||||||
let mut headers_json = serde_json::Map::new();
|
let mut headers_json = serde_json::Map::new();
|
||||||
for (k, v) in headers_tbl.iter() {
|
for (k, v) in headers_tbl.iter() {
|
||||||
if let Some(sv) = v.as_str() {
|
if let Some(sv) = v.as_str() {
|
||||||
@@ -910,7 +916,7 @@ fn json_server_to_toml_table(spec: &Value) -> Result<toml_edit::Table, AppError>
|
|||||||
// 定义核心字段(已在下方处理,跳过通用转换)
|
// 定义核心字段(已在下方处理,跳过通用转换)
|
||||||
let core_fields = match typ {
|
let core_fields = match typ {
|
||||||
"stdio" => vec!["type", "command", "args", "env", "cwd"],
|
"stdio" => vec!["type", "command", "args", "env", "cwd"],
|
||||||
"http" | "sse" => vec!["type", "url", "headers"],
|
"http" | "sse" => vec!["type", "url", "http_headers"],
|
||||||
_ => vec!["type"],
|
_ => vec!["type"],
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -988,7 +994,7 @@ fn json_server_to_toml_table(spec: &Value) -> Result<toml_edit::Table, AppError>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !h_tbl.is_empty() {
|
if !h_tbl.is_empty() {
|
||||||
t["headers"] = Item::Table(h_tbl);
|
t["http_headers"] = Item::Table(h_tbl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user