mcp-utils 0.1.2

Abstractions that extend rust-mcp-sdk for simplified MCP tool definition and server setup
Documentation
use crate::tool::CustomTool;

#[macro_export]
macro_rules! setup_tools {
    ($visibility:vis $enum_name:ident, [$($tool_kind:ident ( $tool:ident ) ),* $(,)?]) => {
        $visibility struct $enum_name {
            inner: __tool_setup::InnerTools,
        }

        mod __tool_setup {
            use super::*;

            rust_mcp_sdk::tool_box!(InnerTools, [$($tool),*]);
        }

        impl $crate::server_prelude::ToolBox for $enum_name {
            fn get_tool(&self) -> $crate::tool_prelude::CustomTool {
                match &self.inner {
                    $(
                        __tool_setup::InnerTools::$tool(tool_value) => $crate::tool_prelude::CustomTool::$tool_kind(tool_value),
                    )*
                }
            }

            fn get_tools() -> Vec<rust_mcp_sdk::schema::Tool> {
                __tool_setup::InnerTools::tools()
            }
        }

        impl TryFrom<rust_mcp_sdk::schema::CallToolRequestParams> for $enum_name {
            type Error = rust_mcp_sdk::schema::schema_utils::CallToolError;

            fn try_from(mut value: rust_mcp_sdk::schema::CallToolRequestParams) -> Result<Self, Self::Error> {
                value.arguments.get_or_insert_default();
                Ok(Self {
                    inner: __tool_setup::InnerTools::try_from(value)?,
                })
            }
        }
    };
    ($enum_name:ident, [$($tool_kind:ident ( $tool:ident ) ),* $(,)?]) => {
        setup_tools!(pub(crate) $enum_name, [$($tool_kind ( $tool ) ),*]);
    };
}
pub use setup_tools;

pub trait ToolBox {
    fn get_tool(&'_ self) -> CustomTool<'_>;

    fn get_tools() -> Vec<rust_mcp_sdk::schema::Tool>;
}