@@ -7,6 +7,7 @@ use syn::{Expr, ImplItem, ItemImpl};
77#[ darling( default ) ]
88pub struct ToolHandlerAttribute {
99 pub router : Expr ,
10+ pub meta : Option < Expr > ,
1011}
1112
1213impl Default for ToolHandlerAttribute {
@@ -16,13 +17,14 @@ impl Default for ToolHandlerAttribute {
1617 self . tool_router
1718 } )
1819 . unwrap ( ) ,
20+ meta : None ,
1921 }
2022 }
2123}
2224
2325pub fn tool_handler ( attr : TokenStream , input : TokenStream ) -> syn:: Result < TokenStream > {
2426 let attr_args = NestedMeta :: parse_meta_list ( attr) ?;
25- let ToolHandlerAttribute { router } = ToolHandlerAttribute :: from_list ( & attr_args) ?;
27+ let ToolHandlerAttribute { router, meta } = ToolHandlerAttribute :: from_list ( & attr_args) ?;
2628 let mut item_impl = syn:: parse2 :: < ItemImpl > ( input. clone ( ) ) ?;
2729 let tool_call_fn = quote ! {
2830 async fn call_tool(
@@ -34,13 +36,24 @@ pub fn tool_handler(attr: TokenStream, input: TokenStream) -> syn::Result<TokenS
3436 #router. call( tcc) . await
3537 }
3638 } ;
39+
40+ let result_meta = if let Some ( meta) = meta {
41+ quote ! { Some ( #meta) }
42+ } else {
43+ quote ! { None }
44+ } ;
45+
3746 let tool_list_fn = quote ! {
3847 async fn list_tools(
3948 & self ,
4049 _request: Option <rmcp:: model:: PaginatedRequestParam >,
4150 _context: rmcp:: service:: RequestContext <rmcp:: RoleServer >,
4251 ) -> Result <rmcp:: model:: ListToolsResult , rmcp:: ErrorData > {
43- Ok ( rmcp:: model:: ListToolsResult :: with_all_items( #router. list_all( ) ) )
52+ Ok ( rmcp:: model:: ListToolsResult {
53+ tools: #router. list_all( ) ,
54+ meta: #result_meta,
55+ next_cursor: None ,
56+ } )
4457 }
4558 } ;
4659 let tool_call_fn = syn:: parse2 :: < ImplItem > ( tool_call_fn) ?;
0 commit comments