-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathmcp_client_handle_message.rs
More file actions
93 lines (85 loc) · 6.61 KB
/
mcp_client_handle_message.rs
File metadata and controls
93 lines (85 loc) · 6.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#![cfg_attr(rustfmt, rustfmt_skip)]
use rust_mcp_schema::{schema_utils::*, *};
use std::str::FromStr;
type AppError = RpcError;
const SAMPLE_PAYLOAD: &str = r#"
{
"id": 0,
"jsonrpc": "2.0",
"result": {
"protocolVersion": "2024-11-05",
"capabilities": {
"prompts": {},
"resources": {
"subscribe": true
},
"tools": {},
"logging": {}
},
"serverInfo": {
"name": "example-servers/everything",
"version": "1.0.0"
}
}
}
"#;
fn main() {
if let Err(error) = handle_message(SAMPLE_PAYLOAD) {
eprintln!("Error occurred: {:?}", error);
}
}
// Determine if the message is an Error
fn handle_message(message_payload: &str) -> std::result::Result<(), AppError> {
// Deserialize message into ServerMessage.
//ServerMessage is a message sent by an MCP Server to an MCP Client.
let mcp_message = ServerMessage::from_str(message_payload)?;
match mcp_message {
// Determine if the message is a Request
ServerMessage::Request(request) => match request {
ServerJsonrpcRequest::PingRequest(ping_request) => println!("Ping request received: {:?}", ping_request),
ServerJsonrpcRequest::GetTaskRequest(get_task_request) => println!("GetTaskRequest request received: {:?}", get_task_request),
ServerJsonrpcRequest::GetTaskPayloadRequest(get_task_payload_request) => println!("GetTaskPayloadRequest request received: {:?}", get_task_payload_request),
ServerJsonrpcRequest::CancelTaskRequest(cancel_task_request) => println!("CancelTaskRequest request received: {:?}", cancel_task_request),
ServerJsonrpcRequest::ListTasksRequest(list_tasks_request) => println!("ListTasksRequest request received: {:?}", list_tasks_request),
ServerJsonrpcRequest::CreateMessageRequest(create_message_request) => println!("CreateMessageRequest request received: {:?}", create_message_request),
ServerJsonrpcRequest::ListRootsRequest(list_roots_request) => println!("ListRootsRequest request received: {:?}", list_roots_request),
ServerJsonrpcRequest::ElicitRequest(elicit_request) => println!("ElicitRequest request received: {:?}", elicit_request),
ServerJsonrpcRequest::CustomRequest(jsonrpc_request) => println!("CustomRequest request received: {:?}", jsonrpc_request),
},
// Determine if the message is a Notification
ServerMessage::Notification(notification) => match notification {
ServerJsonrpcNotification::CancelledNotification(cancelled_notification) => println!("CancelledNotification notification received: {:?}", cancelled_notification),
ServerJsonrpcNotification::ProgressNotification(progress_notification) => println!("ProgressNotification notification received: {:?}", progress_notification),
ServerJsonrpcNotification::ResourceListChangedNotification(resource_list_changed_notification) => println!("ResourceListChangedNotification notification received: {:?}",resource_list_changed_notification),
ServerJsonrpcNotification::ResourceUpdatedNotification(resource_updated_notification) => println!("ResourceUpdatedNotification notification received: {:?}",resource_updated_notification),
ServerJsonrpcNotification::PromptListChangedNotification(prompt_list_changed_notification) => println!("PromptListChangedNotification notification received: {:?}",prompt_list_changed_notification),
ServerJsonrpcNotification::ToolListChangedNotification(tool_list_changed_notification) => println!("ToolListChangedNotification notification received: {:?}",tool_list_changed_notification),
ServerJsonrpcNotification::TaskStatusNotification(task_status_notification) => {println!("TaskStatusNotification notification received: {:?}", task_status_notification)}
ServerJsonrpcNotification::LoggingMessageNotification(logging_message_notification) => println!("LoggingMessageNotification notification received: {:?}",logging_message_notification),
ServerJsonrpcNotification::ElicitationCompleteNotification(elicitation_complete_notification) => println!("ElicitationCompleteNotification notification received: {:?}",elicitation_complete_notification),
ServerJsonrpcNotification::CustomNotification(jsonrpc_notification) => println!("CustomNotification notification received: {:?}", jsonrpc_notification)
},
// Determine if the message is a Response
ServerMessage::Response(response) => match &response.result {
ResultFromServer::InitializeResult(_initialize_result) => println!("InitializeResult response received: {:?}", response),
ResultFromServer::ListResourcesResult(_list_resources_result) => println!("ListResourcesResult response received: {:?}", response),
ResultFromServer::ListResourceTemplatesResult(_list_resource_templates_result) => println!("ListResourceTemplatesResult response received: {:?}", response),
ResultFromServer::ReadResourceResult(_read_resource_result) => println!("ReadResourceResult response received: {:?}", response),
ResultFromServer::ListPromptsResult(_list_prompts_result) => println!("ListPromptsResult response received: {:?}", response),
ResultFromServer::GetPromptResult(_get_prompt_result) => println!("GetPromptResult response received: {:?}", response),
ResultFromServer::ListToolsResult(_list_tools_result) => println!("ListToolsResult response received: {:?}", response),
ResultFromServer::CallToolResult(_call_tool_result) => println!("CallToolResult response received: {:?}", response),
ResultFromServer::GetTaskResult(_get_task_result) => println!("GetTaskResult response received: {:?}", response),
ResultFromServer::CancelTaskResult(_cancel_task_result) => println!("CancelTaskResult response received: {:?}", response),
ResultFromServer::ListTasksResult(_list_tasks_result) => println!("ListTasksResult response received: {:?}", response),
ResultFromServer::CompleteResult(_complete_result) => println!("CompleteResult response received: {:?}", response),
ResultFromServer::CreateTaskResult(_create_task_result) => println!("CreateTaskResult response received: {:?}", response),
ResultFromServer::Result(_generic_result) => println!("Generic Result response received: {:?}", response),
ResultFromServer::GetTaskPayloadResult(_generic_result) => println!("Generic Result response received: {:?}", response),
},
ServerMessage::Error(error_response) => {
println!("Error response received: {:?}", error_response)
}
}
Ok(())
}