Support per-tool MCP output limits (#41421)

## What changed

- Add a positive `output_token_limit` setting to each entry under an MCP server's `tools` configuration.
- Apply the most restrictive limit when plugin and user policies overlap, while keeping approval policy independent.
- Carry the effective MCP output budget in conversation history so tool output, post-tool hook responses, and resumed sessions use the same truncation limit.

## Testing

- Cover configuration parsing, serialization, schema validation, and plugin policy merging.
- Cover MCP output below and above the configured limit, post-tool hook responses, and session resume.

GitOrigin-RevId: d0beb4fca9ba6055d9e1d31c137373b465d50d61
This commit is contained in:
pakrym-oai
2026-08-28 21:40:23 +00:00
committed by copyberry
parent 03147407e3
commit f742dabc6f
38 changed files with 487 additions and 224 deletions
+8 -1
View File
@@ -974,6 +974,7 @@ fn apply_plugin_mcp_server_policy(config: &mut McpServerConfig, policy: &PluginM
if let Some(approval_mode) = tool_policy.approval_mode {
tool_config.approval_mode = Some(approval_mode);
}
tool_config.restrict_output_token_limit(tool_policy.output_token_limit);
}
}
@@ -1449,7 +1450,7 @@ pub fn apply_configured_plugin_mcp_server_policies(
}
}
for (tool_name, tool_policy) in &policy.tools {
if tool_policy.approval_mode.is_some() {
if tool_policy.approval_mode.is_some() || tool_policy.output_token_limit.is_some() {
server.tools.entry(tool_name.clone()).or_default();
}
}
@@ -1467,6 +1468,12 @@ pub fn apply_configured_plugin_mcp_server_policies(
.restrict_to(approval_mode),
);
}
tool_config.restrict_output_token_limit(
policy
.tools
.get(tool_name)
.and_then(|tool_policy| tool_policy.output_token_limit),
);
}
}
}
+3 -1
View File
@@ -1113,7 +1113,7 @@ async fn load_plugins_applies_plugin_mcp_server_policy() {
"default_tools_approval_mode": "prompt",
"enabled_tools": ["read", "search"],
"tools": {
"search": { "approval_mode": "prompt" }
"search": { "approval_mode": "prompt", "output_token_limit": 8000 }
}
}
}
@@ -1134,6 +1134,7 @@ disabled_tools = ["delete"]
[plugins."sample@test".mcp_servers.sample.tools.search]
approval_mode = "approve"
output_token_limit = 12000
"#;
let outcome =
@@ -1154,6 +1155,7 @@ approval_mode = "approve"
server.tools.get("search"),
Some(&McpServerToolConfig {
approval_mode: Some(AppToolApproval::Approve),
output_token_limit: std::num::NonZeroUsize::new(8_000),
})
);
}