#![allow(clippy::disallowed_methods)]
use crate::types::{InputSchema, ToolCallResult, ToolDefinition};
pub const NAME: &str = "apr.version";
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
#[must_use]
pub fn version_tool_definition() -> ToolDefinition {
let input_schema: InputSchema = serde_json::from_str(crate::schemas::APR_VERSION_SCHEMA)
.expect(
"FALSIFY-MCP-008: apr.version codegen constant must parse as InputSchema; \
regenerate by editing contracts/apr-mcp-tool-schemas-v1.yaml and rebuilding",
);
ToolDefinition {
name: NAME.to_string(),
description: crate::schemas::APR_VERSION_DESCRIPTION.to_string(),
input_schema,
}
}
#[must_use]
pub fn call(_args: &serde_json::Value) -> ToolCallResult {
let payload = serde_json::json!({
"server": crate::SERVER_NAME,
"version": VERSION,
"protocol_version": crate::PROTOCOL_VERSION,
});
ToolCallResult::success(payload.to_string())
}
pub fn dispatch(
args: &serde_json::Value,
_cancel: &std::sync::mpsc::Receiver<()>,
_sink: Option<&crate::server::NotificationSink>,
_token: Option<serde_json::Value>,
) -> ToolCallResult {
call(args)
}
crate::register_mcp_tool!(
name: NAME,
definition: version_tool_definition,
dispatch: dispatch,
);
#[cfg(test)]
#[allow(clippy::disallowed_methods)] mod tests {
use super::*;
#[test]
fn definition_has_correct_name() {
let def = version_tool_definition();
assert_eq!(def.name, "apr.version");
assert!(def.input_schema.required.is_empty());
assert_eq!(def.input_schema.schema_type, "object");
}
#[test]
fn call_returns_version_payload() {
let result = call(&serde_json::json!({}));
assert!(result.is_error.is_none());
let text = &result.content[0].text;
let parsed: serde_json::Value = serde_json::from_str(text).expect("valid json");
assert_eq!(parsed["server"], "aprender-mcp");
assert_eq!(parsed["version"], VERSION);
assert_eq!(parsed["protocol_version"], "2024-11-05");
}
}