#model-context #model-context-protocols #protocols #context #model #rust-mcp-stack #macro

macro rust-mcp-macros

A procedural macro that derives the MCPToolSchema implementation for structs or enums, generating a tool_input_schema function used with rust_mcp_schema::Tool

3 releases

new 0.1.2 Mar 30, 2025
0.1.1 Mar 30, 2025
0.1.0 Mar 29, 2025

#5 in #model-context

Download history 284/week @ 2025-03-25

284 downloads per month
Used in rust-mcp-sdk

MIT license

260KB
397 lines

rust-mcp-macros.

A procedural macro, part of the rust-mcp-sdk ecosystem, to generate rust_mcp_schema::Tool instance from a struct.

The mcp_tool macro generates an implementation for the annotated struct that includes:

  • A tool_name() method returning the tool's name as a string.
  • A get_tool() method returning a rust_mcp_schema::Tool instance with the tool's name, description, and input schema derived from the struct's fields.

Attributes

  • name - The name of the tool (required, non-empty string).
  • description - A description of the tool (required, non-empty string).

Usage Example

#[mcp_tool(
   name = "write_file",
   description = "Create a new file or completely overwrite an existing file with new content."
)]
#[derive(rust_mcp_macros::JsonSchema)]
pub struct WriteFileTool {
    /// The target file's path for writing content.
    pub path: String,
    /// The string content to be written to the file
    pub content: String,
}

fn main() {

    assert_eq!(WriteFileTool::tool_name(), "write_file");

    let tool: rust_mcp_schema::Tool = WriteFileTool::get_tool();
    assert_eq!(tool.name, "write_file");
    assert_eq!( tool.description.unwrap(),"Create a new file or completely overwrite an existing file with new content.");

    let schema_properties = tool.input_schema.properties.unwrap();
    assert_eq!(schema_properties.len(), 2);
    assert!(schema_properties.contains_key("path"));
    assert!(schema_properties.contains_key("content"));

    // get the `content` prop from schema
    let content_prop = schema_properties.get("content").unwrap();

    // assert the type
    assert_eq!(content_prop.get("type").unwrap(), "string");
    // assert the description
    assert_eq!(
        content_prop.get("description").unwrap(),
        "The string content to be written to the file"
    );
}


Check out rust-mcp-sdk , a high-performance, asynchronous toolkit for building MCP servers and clients. Focus on your app's logic while rust-mcp-sdk takes care of the rest!


Dependencies

~0.6–1.5MB
~32K SLoC