use crate::domain::ProtocolVersion;
const STATEFUL: &[&str] = &[
"completion/complete",
"initialize",
"logging/setLevel",
"ping",
"prompts/get",
"prompts/list",
"resources/list",
"resources/read",
"resources/subscribe",
"resources/templates/list",
"resources/unsubscribe",
"tools/call",
"tools/list",
];
const TASKS: &[&str] = &["tasks/cancel", "tasks/get", "tasks/list", "tasks/result"];
const STATELESS: &[&str] = &[
"completion/complete",
"prompts/get",
"prompts/list",
"resources/list",
"resources/read",
"resources/templates/list",
"server/discover",
"subscriptions/listen",
"tools/call",
"tools/list",
];
#[must_use]
pub fn client_method_defined_in(version: ProtocolVersion, method: &str) -> bool {
match version {
ProtocolVersion::V2024_11_05
| ProtocolVersion::V2025_03_26
| ProtocolVersion::V2025_06_18 => STATEFUL.contains(&method),
ProtocolVersion::V2025_11_25 => STATEFUL.contains(&method) || TASKS.contains(&method),
ProtocolVersion::V2026_07_28 | ProtocolVersion::Unknown(_) => STATELESS.contains(&method),
}
}
#[cfg(test)]
mod tests {
use super::client_method_defined_in;
use crate::domain::ProtocolVersion;
#[test]
fn the_handshake_exists_exactly_where_the_negotiation_says_it_does() {
for version in [
ProtocolVersion::V2024_11_05,
ProtocolVersion::V2025_03_26,
ProtocolVersion::V2025_06_18,
ProtocolVersion::V2025_11_25,
ProtocolVersion::V2026_07_28,
] {
assert_eq!(
client_method_defined_in(version, "initialize"),
crate::domain::handshake_defined_in(version),
"initialize at {version}"
);
assert_eq!(
client_method_defined_in(version, "server/discover"),
crate::domain::discover_defined_in(version),
"server/discover at {version}"
);
}
}
#[test]
fn tasks_are_core_only_in_2025_11_25() {
assert!(client_method_defined_in(
ProtocolVersion::V2025_11_25,
"tasks/get"
));
assert!(!client_method_defined_in(
ProtocolVersion::V2025_06_18,
"tasks/get"
));
assert!(!client_method_defined_in(
ProtocolVersion::V2026_07_28,
"tasks/get"
));
}
#[test]
fn the_replaced_methods_are_gone_in_2026_07_28() {
for method in [
"ping",
"logging/setLevel",
"resources/subscribe",
"resources/unsubscribe",
] {
assert!(client_method_defined_in(
ProtocolVersion::V2025_11_25,
method
));
assert!(
!client_method_defined_in(ProtocolVersion::V2026_07_28, method),
"{method}"
);
}
}
#[test]
fn an_unknown_method_is_defined_nowhere() {
assert!(!client_method_defined_in(
ProtocolVersion::V2025_11_25,
"unknown/method"
));
assert!(!client_method_defined_in(
ProtocolVersion::V2026_07_28,
"unknown/method"
));
}
}