use serde_json::Value;
use turbomcp_core::ProtocolVersion;
use turbomcp_core::meta::keys::PROTOCOL_VERSION;
#[must_use]
pub fn request_protocol_version(params: Option<&Value>) -> Option<ProtocolVersion> {
let meta = params?.get("_meta")?.as_object()?;
let raw = meta.get(PROTOCOL_VERSION)?.as_str()?;
Some(ProtocolVersion::from_wire(raw))
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn reads_draft_version_from_meta() {
let params = json!({
"name": "echo",
"_meta": { "io.modelcontextprotocol/protocolVersion": "2026-07-28" }
});
assert_eq!(
request_protocol_version(Some(¶ms)),
Some(ProtocolVersion::Draft)
);
}
#[test]
fn absent_meta_is_none() {
assert_eq!(request_protocol_version(Some(&json!({"name": "x"}))), None);
assert_eq!(request_protocol_version(None), None);
}
#[test]
fn unknown_version_string_preserved() {
let params =
json!({ "_meta": { "io.modelcontextprotocol/protocolVersion": "9999-99-99" } });
assert_eq!(
request_protocol_version(Some(¶ms)),
Some(ProtocolVersion::Unknown("9999-99-99".into()))
);
}
}