refactor: improve MCP parameter normalization and test clarity

- Changed `normalize_mcp_parameters` to avoid mutating the input parameters.
- Updated the test name to better reflect its purpose of preserving the cursor object union schema.
- Adjusted assertions in the test to compare the entire schema instead of individual fields.
This commit is contained in:
leokun
2026-08-27 11:11:13 +08:00
parent 995a12df44
commit 31dfa8d295
+4 -6
View File
@@ -478,9 +478,9 @@ pub fn dynamic_mcp(
Ok(output) Ok(output)
} }
fn normalize_mcp_parameters(tool_name: &str, mut parameters: Value) -> Result<Value> { fn normalize_mcp_parameters(tool_name: &str, parameters: Value) -> Result<Value> {
let schema = parameters let schema = parameters
.as_object_mut() .as_object()
.ok_or_else(|| invalid_mcp_parameters(tool_name))?; .ok_or_else(|| invalid_mcp_parameters(tool_name))?;
match schema.get("type") { match schema.get("type") {
Some(Value::String(schema_type)) if schema_type == "object" => return Ok(parameters), Some(Value::String(schema_type)) if schema_type == "object" => return Ok(parameters),
@@ -505,7 +505,6 @@ fn normalize_mcp_parameters(tool_name: &str, mut parameters: Value) -> Result<Va
if !object_only_union { if !object_only_union {
return Err(invalid_mcp_parameters(tool_name)); return Err(invalid_mcp_parameters(tool_name));
} }
schema.insert("type".into(), Value::String("object".into()));
Ok(parameters) Ok(parameters)
} }
@@ -614,7 +613,7 @@ mod tests {
} }
#[test] #[test]
fn dynamic_mcp_normalizes_cursor_object_union_without_mutating_wire_schema() { fn dynamic_mcp_preserves_cursor_object_union_schema() {
let original_schema = serde_json::json!({ let original_schema = serde_json::json!({
"$schema": "https://json-schema.org/draft/2020-12/schema", "$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [ "anyOf": [
@@ -655,8 +654,7 @@ mod tests {
.get("cursor-app-control-move_agent_to_cloned_root") .get("cursor-app-control-move_agent_to_cloned_root")
.unwrap(); .unwrap();
assert_eq!(definition.parameters["type"], "object"); assert_eq!(definition.parameters, original_schema);
assert_eq!(definition.parameters["anyOf"], original_schema["anyOf"]);
assert_eq!( assert_eq!(
wire.input_schema_json.as_deref(), wire.input_schema_json.as_deref(),
Some(original_json.as_str()) Some(original_json.as_str())