#[macro_export]
macro_rules! tool_box {
($enum_name:ident, [$($tool:ident),* $(,)?]) => {
#[derive(Debug)]
pub enum $enum_name {
$(
$tool($tool),
)*
}
impl $enum_name {
pub fn tool_name(&self) -> String {
match self {
$(
$enum_name::$tool(_) => $tool::tool_name(),
)*
}
}
pub fn tools() -> Vec<rust_mcp_sdk::schema::Tool> {
vec![
$(
$tool::tool(),
)*
]
}
}
impl TryFrom<rust_mcp_sdk::schema::CallToolRequestParams> for $enum_name {
type Error = rust_mcp_sdk::schema::schema_utils::CallToolError;
fn try_from(value: rust_mcp_sdk::schema::CallToolRequestParams) -> Result<Self, Self::Error> {
let arguments = value
.arguments
.ok_or(rust_mcp_sdk::schema::schema_utils::CallToolError::invalid_arguments(
&value.name,
Some("Missing 'arguments' field in the request".to_string())
))?;
let v = serde_json::to_value(arguments).map_err(|err| {
rust_mcp_sdk::schema::schema_utils::CallToolError::invalid_arguments(
&value.name,
Some(format!("{err}")),
)
})?;
match value.name {
$(
name if name == $tool::tool_name().as_str() => {
Ok(Self::$tool(serde_json::from_value(v).map_err(rust_mcp_sdk::schema::schema_utils::CallToolError::new)?))
}
)*
_ => {
Err(
rust_mcp_sdk::schema::schema_utils::CallToolError::unknown_tool(value.name.to_string())
)
}
}
}
}
}
}