objectiveai_sdk/http/
mcp_handler.rs1use crate::client_objectiveai_mcp::{server_request, server_response};
17use std::future::Future;
18
19pub trait McpHandler: Send + Sync + 'static {
26 fn handle(
30 &self,
31 request: server_request::Request,
32 ) -> impl Future<Output = server_response::Response> + Send;
33}
34
35#[derive(Debug, Clone, Copy, Default)]
40pub struct RejectHandler;
41
42const REJECT_CODE: i64 = -32601;
46const REJECT_MESSAGE: &str = "this client does not host objectiveai-mcp";
47
48fn reject_err<R>() -> server_response::JsonRpcResult<R> {
49 server_response::JsonRpcResult::Err {
50 code: REJECT_CODE,
51 message: REJECT_MESSAGE.into(),
52 data: None,
53 }
54}
55
56impl McpHandler for RejectHandler {
57 async fn handle(
58 &self,
59 request: server_request::Request,
60 ) -> server_response::Response {
61 use server_response::Payload;
66 let payload = match request.payload {
67 server_request::Payload::Initialize { mcp_kind, .. } => {
68 Payload::Initialize { mcp_kind, result: reject_err() }
69 }
70 server_request::Payload::ToolsList { mcp_kind, .. } => {
71 Payload::ToolsList { mcp_kind, result: reject_err() }
72 }
73 server_request::Payload::ToolsCall { mcp_kind, .. } => {
74 Payload::ToolsCall { mcp_kind, result: reject_err() }
75 }
76 server_request::Payload::ResourcesList { mcp_kind, .. } => {
77 Payload::ResourcesList { mcp_kind, result: reject_err() }
78 }
79 server_request::Payload::ResourcesRead { mcp_kind, .. } => {
80 Payload::ResourcesRead { mcp_kind, result: reject_err() }
81 }
82 server_request::Payload::SessionTerminate { mcp_kind } => {
83 Payload::SessionTerminate { mcp_kind, result: reject_err() }
84 }
85 server_request::Payload::ReadMessageQueue(_) => {
86 Payload::ReadMessageQueue(reject_err())
87 }
88 server_request::Payload::Retrieve(_) => {
89 Payload::Retrieve(reject_err())
90 }
91 server_request::Payload::Script(_) => {
92 Payload::Script(reject_err())
93 }
94 server_request::Payload::Drop(_) => {
97 Payload::Drop(server_response::DropResult { dropped: false })
98 }
99 server_request::Payload::LaboratoryExportBegin(_) => {
100 Payload::LaboratoryExportBegin(reject_err())
101 }
102 server_request::Payload::LaboratoryExportRead(_) => {
103 Payload::LaboratoryExportRead(reject_err())
104 }
105 server_request::Payload::LaboratoryExportAbort(_) => {
106 Payload::LaboratoryExportAbort(reject_err())
107 }
108 server_request::Payload::LaboratoryImportBegin(_) => {
109 Payload::LaboratoryImportBegin(reject_err())
110 }
111 server_request::Payload::LaboratoryImportWrite(_) => {
112 Payload::LaboratoryImportWrite(reject_err())
113 }
114 server_request::Payload::LaboratoryImportEnd(_) => {
115 Payload::LaboratoryImportEnd(reject_err())
116 }
117 server_request::Payload::LaboratoryImportAbort(_) => {
118 Payload::LaboratoryImportAbort(reject_err())
119 }
120 server_request::Payload::LaboratoryTransfer(_) => {
121 Payload::LaboratoryTransfer(reject_err())
122 }
123 server_request::Payload::LaboratoryLocalTransfer(_) => {
124 Payload::LaboratoryLocalTransfer(reject_err())
125 }
126 };
127 server_response::Response {
128 id: request.id,
129 payload,
130 }
131 }
132}