mcp_utils/
tool_box.rs

1use crate::tool::CustomTool;
2
3#[macro_export]
4macro_rules! setup_tools {
5    ($visibility:vis $enum_name:ident, [$($tool_kind:ident ( $tool:ident ) ),* $(,)?]) => {
6        $visibility struct $enum_name {
7            inner: __tool_setup::InnerTools,
8        }
9
10        mod __tool_setup {
11            use super::*;
12
13            rust_mcp_sdk::tool_box!(InnerTools, [$($tool),*]);
14        }
15
16        impl $crate::server_prelude::ToolBox for $enum_name {
17            fn get_tool(&self) -> $crate::tool_prelude::CustomTool {
18                match &self.inner {
19                    $(
20                        __tool_setup::InnerTools::$tool(tool_value) => $crate::tool_prelude::CustomTool::$tool_kind(tool_value),
21                    )*
22                }
23            }
24
25            fn get_tools() -> Vec<rust_mcp_sdk::schema::Tool> {
26                __tool_setup::InnerTools::tools()
27            }
28        }
29
30        impl TryFrom<rust_mcp_sdk::schema::CallToolRequestParams> for $enum_name {
31            type Error = rust_mcp_sdk::schema::schema_utils::CallToolError;
32
33            fn try_from(mut value: rust_mcp_sdk::schema::CallToolRequestParams) -> Result<Self, Self::Error> {
34                value.arguments.get_or_insert_default();
35                Ok(Self {
36                    inner: __tool_setup::InnerTools::try_from(value)?,
37                })
38            }
39        }
40    };
41    ($enum_name:ident, [$($tool_kind:ident ( $tool:ident ) ),* $(,)?]) => {
42        setup_tools!(pub(crate) $enum_name, [$($tool_kind ( $tool ) ),*]);
43    };
44}
45pub use setup_tools;
46
47pub trait ToolBox {
48    fn get_tool(&'_ self) -> CustomTool<'_>;
49
50    fn get_tools() -> Vec<rust_mcp_sdk::schema::Tool>;
51}