Skip to content

Data Flow Architecture

Message Flow Patterns

Client β†’ Server Request Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Client    β”‚    β”‚  Transport  β”‚    β”‚  Protocol   β”‚    β”‚   Server    β”‚
β”‚     API     β”‚    β”‚    Layer    β”‚    β”‚   State     β”‚    β”‚  Handler    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚                   β”‚                   β”‚                   β”‚
       β”‚ send_request()    β”‚                   β”‚                   β”‚
       β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ίβ”‚                   β”‚                   β”‚
       β”‚                   β”‚ validate_phase()  β”‚                   β”‚
       β”‚                   β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ίβ”‚                   β”‚
       β”‚                   β”‚                   β”‚ route_message()   β”‚
       β”‚                   β”‚                   β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ίβ”‚
       β”‚                   β”‚                   β”‚                   β”‚
       β”‚                   β”‚                   β”‚ ◄──────────────────
       β”‚                   β”‚ ◄──────────────────    response       β”‚
       β”‚ ◄──────────────────    response       β”‚                   β”‚

Server β†’ Client Request Flow (Sampling)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Server    β”‚    β”‚  Protocol   β”‚    β”‚  Transport  β”‚    β”‚   Client    β”‚
β”‚   Handler   β”‚    β”‚   State     β”‚    β”‚    Layer    β”‚    β”‚  Handler    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚                    β”‚                   β”‚                   β”‚
       β”‚ request_sampling() β”‚                   β”‚                   β”‚
       β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ί β”‚                   β”‚                   β”‚
       β”‚                    β”‚ validate_capabilityβ”‚                  β”‚
       β”‚                    β”‚                   β”‚ send_request()    β”‚
       β”‚                    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ίβ”‚                   β”‚
       β”‚                    β”‚                   β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ίβ”‚
       β”‚                    β”‚                   β”‚                   β”‚
       β”‚                    β”‚                   β”‚ ◄──────────────────
       β”‚                    β”‚ ◄──────────────────   approval_flow   β”‚
       β”‚ ◄───────────────── ─                   β”‚                   β”‚

Error Propagation Flow

// Hierarchical error handling with context preservation
#[derive(Debug, thiserror::Error)]
pub enum McpError {
    #[error("Transport error: {0}")]
    Transport(#[from] TransportError),

    #[error("Protocol error: {0}")]
    Protocol(#[from] ProtocolError),

    #[error("Security error: {0}")]
    Security(#[from] SecurityError),

    #[error("Feature error: {0}")]
    Feature(#[from] FeatureError),
}

// Error context preservation through the stack
impl From<ValidationError> for ProtocolError {
    fn from(err: ValidationError) -> Self {
        ProtocolError::InvalidMessage {
            reason: err.to_string(),
            phase: err.context.phase,
            method: err.context.method,
        }
    }
}