turbomcp_protocol/context/
server_initiated.rs1use std::collections::HashMap;
8
9use serde::{Deserialize, Serialize};
10use uuid::Uuid;
11
12use super::capabilities::{CommunicationDirection, CommunicationInitiator, ServerInitiatedType};
13use super::client::ClientCapabilities;
14use crate::types::Timestamp;
15
16#[derive(Debug, Clone, Serialize, Deserialize)]
18pub struct BidirectionalContext {
19 pub direction: CommunicationDirection,
21 pub initiator: CommunicationInitiator,
23 pub expects_response: bool,
25 pub parent_request_id: Option<String>,
27 pub request_type: Option<String>,
29 pub server_id: Option<String>,
31 pub correlation_id: String,
33 pub metadata: HashMap<String, serde_json::Value>,
35}
36
37#[derive(Debug, Clone, Serialize, Deserialize)]
39pub struct ServerInitiatedContext {
40 pub request_type: ServerInitiatedType,
42 pub server_id: String,
44 pub correlation_id: String,
46 pub client_capabilities: Option<ClientCapabilities>,
48 pub initiated_at: Timestamp,
50 pub metadata: HashMap<String, serde_json::Value>,
52}
53
54impl BidirectionalContext {
55 pub fn new(direction: CommunicationDirection, initiator: CommunicationInitiator) -> Self {
57 Self {
58 direction,
59 initiator,
60 expects_response: true,
61 parent_request_id: None,
62 request_type: None,
63 server_id: None,
64 correlation_id: Uuid::new_v4().to_string(),
65 metadata: HashMap::new(),
66 }
67 }
68
69 pub fn with_direction(mut self, direction: CommunicationDirection) -> Self {
71 self.direction = direction;
72 self
73 }
74
75 pub fn with_request_type(mut self, request_type: String) -> Self {
77 self.request_type = Some(request_type);
78 self
79 }
80
81 pub fn validate_direction(&self) -> Result<(), String> {
83 match (&self.direction, &self.initiator) {
84 (CommunicationDirection::ClientToServer, CommunicationInitiator::Client) => Ok(()),
85 (CommunicationDirection::ServerToClient, CommunicationInitiator::Server) => Ok(()),
86 _ => Err("Invalid direction/initiator combination".to_string()),
87 }
88 }
89}
90
91impl ServerInitiatedContext {
92 pub fn new(request_type: ServerInitiatedType, server_id: String) -> Self {
94 Self {
95 request_type,
96 server_id,
97 correlation_id: Uuid::new_v4().to_string(),
98 client_capabilities: None,
99 initiated_at: Timestamp::now(),
100 metadata: HashMap::new(),
101 }
102 }
103
104 pub fn with_capabilities(mut self, capabilities: ClientCapabilities) -> Self {
106 self.client_capabilities = Some(capabilities);
107 self
108 }
109
110 pub fn with_metadata(mut self, key: String, value: serde_json::Value) -> Self {
112 self.metadata.insert(key, value);
113 self
114 }
115}