Merge pull request #425 from kevin9327/fix/mcp-resource-truncation-notice

fix(tools): report the ListMcpResources cap in resources, not bytes
This commit is contained in:
leokun
2026-09-06 20:57:55 +08:00
committed by GitHub
@@ -517,11 +517,9 @@ fn gate_mcp_resources(tool: &mut pb::ListMcpResourcesToolCall) {
.push(pb::list_mcp_resources_exec_result::McpResource { .push(pb::list_mcp_resources_exec_result::McpResource {
uri: "truncated:list-mcp-resources".into(), uri: "truncated:list-mcp-resources".into(),
name: Some("truncated".into()), name: Some("truncated".into()),
description: Some(truncation_notice( description: Some(format!(
"ListMcpResources", "[truncated: ListMcpResources result exceeded {MCP_RESOURCE_LIMIT} resources; showing {} of {original} resources]",
MCP_TEXT_LIMIT, success.resources.len()
success.resources.len(),
original,
)), )),
..Default::default() ..Default::default()
}); });
@@ -861,4 +859,39 @@ mod tests {
let mut content = String::new(); let mut content = String::new();
tool_completion("Grep", &mut tool, &mut content); tool_completion("Grep", &mut tool, &mut content);
} }
#[test]
fn list_mcp_resources_reports_the_cap_it_actually_applied() {
let resources = (0..MCP_RESOURCE_LIMIT + 50)
.map(|index| pb::list_mcp_resources_exec_result::McpResource {
uri: format!("mcp://resource/{index}"),
..Default::default()
})
.collect();
let mut tool = pb::ListMcpResourcesToolCall {
args: None,
result: Some(pb::ListMcpResourcesExecResult {
result: Some(pb::list_mcp_resources_exec_result::Result::Success(
pb::ListMcpResourcesSuccess { resources },
)),
}),
};
gate_mcp_resources(&mut tool);
let pb::list_mcp_resources_exec_result::Result::Success(success) =
tool.result.unwrap().result.unwrap()
else {
panic!("expected a successful result");
};
let notice = success.resources.last().unwrap();
assert_eq!(notice.uri, "truncated:list-mcp-resources");
assert_eq!(
notice.description.as_deref(),
Some(
"[truncated: ListMcpResources result exceeded 200 resources; \
showing 200 of 250 resources]"
)
);
}
} }