lifecycle_server/lifecycle_server.rs
1use mcprotocol_rs::{
2 error_codes,
3 protocol::ServerCapabilities,
4 transport::{ServerTransportFactory, TransportConfig, TransportType},
5 ImplementationInfo, Message, Response, ResponseError, Result, PROTOCOL_VERSION,
6};
7use serde_json::json;
8use std::collections::HashSet;
9use tokio;
10
11#[tokio::main]
12async fn main() -> Result<()> {
13 // 跟踪会话中使用的请求 ID
14 // Track request IDs used in the session
15 let mut session_ids = HashSet::new();
16
17 // 配置 Stdio 服务器
18 // Configure Stdio server
19 let config = TransportConfig {
20 transport_type: TransportType::Stdio {
21 server_path: None,
22 server_args: None,
23 },
24 parameters: None,
25 };
26
27 // 创建服务器实例
28 // Create server instance
29 let factory = ServerTransportFactory;
30 let mut server = factory.create(config)?;
31 let mut initialized = false;
32
33 // 启动服务器
34 // Start server
35 eprintln!("Server starting...");
36 server.initialize().await?;
37
38 // 处理消息循环
39 // Message handling loop
40 loop {
41 match server.receive().await {
42 Ok(message) => {
43 match message {
44 Message::Request(request) => {
45 // 验证请求 ID 的唯一性
46 // Validate request ID uniqueness
47 if !request.validate_id_uniqueness(&mut session_ids) {
48 let error = ResponseError {
49 code: error_codes::INVALID_REQUEST,
50 message: "Request ID has already been used".to_string(),
51 data: None,
52 };
53 let response = Response::error(error, request.id);
54 server.send(Message::Response(response)).await?;
55 continue;
56 }
57
58 match request.method.as_str() {
59 "initialize" => {
60 // 处理初始化请求
61 // Handle initialize request
62 eprintln!("Received initialize request");
63
64 // 解析客户端能力和版本
65 // Parse client capabilities and version
66 if let Some(params) = request.params {
67 let client_version = params
68 .get("protocolVersion")
69 .and_then(|v| v.as_str())
70 .unwrap_or("unknown");
71
72 // 版本检查
73 // Version check
74 if client_version != PROTOCOL_VERSION {
75 // 发送错误响应
76 // Send error response
77 let error = ResponseError {
78 code: error_codes::INVALID_REQUEST,
79 message: "Unsupported protocol version".to_string(),
80 data: Some(json!({
81 "supported": [PROTOCOL_VERSION],
82 "requested": client_version
83 })),
84 };
85 let response = Response::error(error, request.id);
86 server.send(Message::Response(response)).await?;
87 continue;
88 }
89
90 // 发送成功响应
91 // Send success response
92 let response = Response::success(
93 json!({
94 "protocolVersion": PROTOCOL_VERSION,
95 "capabilities": ServerCapabilities {
96 prompts: None,
97 resources: None,
98 tools: None,
99 logging: Some(json!({})),
100 experimental: None,
101 },
102 "serverInfo": ImplementationInfo {
103 name: "Example Server".to_string(),
104 version: "1.0.0".to_string(),
105 }
106 }),
107 request.id,
108 );
109 server.send(Message::Response(response)).await?;
110 }
111 }
112 "shutdown" => {
113 if !initialized {
114 // 如果未初始化,发送错误
115 // If not initialized, send error
116 let error = ResponseError {
117 code: error_codes::SERVER_NOT_INITIALIZED,
118 message: "Server not initialized".to_string(),
119 data: None,
120 };
121 let response = Response::error(error, request.id);
122 server.send(Message::Response(response)).await?;
123 continue;
124 }
125
126 // 发送成功响应
127 // Send success response
128 let response = Response::success(json!(null), request.id);
129 server.send(Message::Response(response)).await?;
130
131 // 等待退出通知
132 // Wait for exit notification
133 eprintln!("Server shutting down...");
134 break;
135 }
136 _ => {
137 if !initialized {
138 // 如果未初始化,拒绝其他请求
139 // If not initialized, reject other requests
140 let error = ResponseError {
141 code: error_codes::SERVER_NOT_INITIALIZED,
142 message: "Server not initialized".to_string(),
143 data: None,
144 };
145 let response = Response::error(error, request.id);
146 server.send(Message::Response(response)).await?;
147 }
148 }
149 }
150 }
151 Message::Notification(notification) => match notification.method.as_str() {
152 "initialized" => {
153 eprintln!("Server initialized");
154 initialized = true;
155 }
156 "exit" => {
157 eprintln!("Received exit notification");
158 break;
159 }
160 _ => {}
161 },
162 _ => {}
163 }
164 }
165 Err(e) => {
166 eprintln!("Error receiving message: {}", e);
167 break;
168 }
169 }
170 }
171
172 // 关闭服务器
173 // Close server
174 server.close().await?;
175 eprintln!("Server stopped");
176 Ok(())
177}