#![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())
}
#[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");
}
}