use http::{HeaderName, HeaderValue};
use rmcp::model::{ClientCapabilities, ClientJsonRpcMessage, GetMeta, ProtocolVersion};
use std::collections::HashMap;
pub(super) fn stamp_request_metadata(
message: &mut ClientJsonRpcMessage,
custom_headers: &HashMap<HeaderName, HeaderValue>,
client_capabilities: &ClientCapabilities,
) {
let ClientJsonRpcMessage::Request(request) = message else {
return;
};
let Some(negotiated) = custom_headers
.get(&HeaderName::from_static(HEADER_MCP_PROTOCOL_VERSION_LOWER))
.and_then(|value| value.to_str().ok())
else {
return;
};
if negotiated < ProtocolVersion::V_2026_07_28.as_str() {
return;
}
let Some(version) = ProtocolVersion::KNOWN_VERSIONS
.iter()
.find(|known| known.as_str() == negotiated)
else {
return;
};
let meta = request.request.get_meta_mut();
if meta.protocol_version().is_none() {
meta.set_protocol_version(version.clone());
}
if meta.client_capabilities().is_none() {
meta.set_client_capabilities(client_capabilities.clone());
}
}
const HEADER_MCP_PROTOCOL_VERSION_LOWER: &str = "mcp-protocol-version";