fastmcp 0.0.0

A Rust framework for building Model Context Protocol (MCP) services
Documentation
use std::collections::HashMap;

use serde::{Deserialize, Serialize};
use serde_json::Value;

/// Unique identifier for a message
pub type MessageId = String;

/// Unique identifier for a session
pub type SessionId = String;

/// MCP message type (request, response, etc.)
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum MessageType {
    Request,
    Response,
    Notification,
    Error,
}

/// Base MCP message structure
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Message {
    /// Unique message identifier
    pub id: MessageId,

    /// Message type
    #[serde(rename = "type")]
    pub message_type: MessageType,

    /// Session identifier
    #[serde(skip_serializing_if = "Option::is_none")]
    pub session_id: Option<SessionId>,

    /// Additional metadata
    #[serde(skip_serializing_if = "Option::is_none")]
    pub metadata: Option<HashMap<String, Value>>,
}

/// MCP request message
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Request {
    /// Base message fields
    #[serde(flatten)]
    pub message: Message,

    /// Tool to execute
    pub tool: String,

    /// Parameters for the tool
    pub params: Value,
}

/// MCP response message
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Response {
    /// Base message fields
    #[serde(flatten)]
    pub message: Message,

    /// Response data
    pub data: Value,

    /// Whether this is a partial response
    #[serde(skip_serializing_if = "Option::is_none")]
    pub partial: Option<bool>,
}

/// MCP error message
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorMessage {
    /// Base message fields
    #[serde(flatten)]
    pub message: Message,

    /// Error code
    pub code: i32,

    /// Error message
    pub error: String,

    /// Additional error details
    #[serde(skip_serializing_if = "Option::is_none")]
    pub details: Option<Value>,
}

/// MCP notification message
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Notification {
    /// Base message fields
    #[serde(flatten)]
    pub message: Message,

    /// Notification name
    pub name: String,

    /// Notification data
    pub data: Value,
}

/// Tool metadata for discovery
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolMetadata {
    /// Tool name
    pub name: String,

    /// Tool description
    pub description: String,

    /// Tool parameters schema (JSON Schema)
    pub parameters: Value,

    /// Tool return value schema (JSON Schema)
    #[serde(skip_serializing_if = "Option::is_none")]
    pub return_schema: Option<Value>,

    /// Whether this tool supports streaming responses
    #[serde(default)]
    pub streaming: bool,

    /// Tool categories for organization
    #[serde(default)]
    pub categories: Vec<String>,

    /// Tool version (optional)
    #[serde(skip_serializing_if = "Option::is_none")]
    pub version: Option<String>,

    /// Tool author (optional)
    #[serde(skip_serializing_if = "Option::is_none")]
    pub author: Option<String>,

    /// Tool documentation URL (optional)
    #[serde(skip_serializing_if = "Option::is_none")]
    pub documentation_url: Option<String>,

    /// Whether this tool is deprecated
    #[serde(default)]
    pub deprecated: bool,

    /// Deprecation message if tool is deprecated
    #[serde(skip_serializing_if = "Option::is_none")]
    pub deprecation_message: Option<String>,
}

/// List tools request/response
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListToolsResponse {
    /// Base message fields
    #[serde(flatten)]
    pub message: Message,

    /// List of available tools
    pub tools: Vec<ToolMetadata>,
}