Skip to content

Commit 06aa798

Browse files
committed
fix: update OutgoingMessageSender::send_response() to take Serialize
1 parent 08ed618 commit 06aa798

File tree

5 files changed

+29
-17
lines changed

5 files changed

+29
-17
lines changed

codex-rs/mcp-server/src/codex_tool_runner.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ pub async fn run_codex_tool_session(
6161
is_error: Some(true),
6262
structured_content: None,
6363
};
64-
outgoing.send_response(id.clone(), result.into()).await;
64+
outgoing.send_response(id.clone(), result).await;
6565
return;
6666
}
6767
};
@@ -235,9 +235,7 @@ async fn run_codex_tool_session_inner(
235235
is_error: None,
236236
structured_content: None,
237237
};
238-
outgoing
239-
.send_response(request_id.clone(), result.into())
240-
.await;
238+
outgoing.send_response(request_id.clone(), result).await;
241239
// unregister the id so we don't keep it in the map
242240
running_requests_id_to_codex_uuid
243241
.lock()
@@ -296,9 +294,7 @@ async fn run_codex_tool_session_inner(
296294
// structured way.
297295
structured_content: None,
298296
};
299-
outgoing
300-
.send_response(request_id.clone(), result.into())
301-
.await;
297+
outgoing.send_response(request_id.clone(), result).await;
302298
break;
303299
}
304300
}

codex-rs/mcp-server/src/error_code.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
pub(crate) const INVALID_REQUEST_ERROR_CODE: i64 = -32600;
2+
pub(crate) const INTERNAL_ERROR_CODE: i64 = -32603;

codex-rs/mcp-server/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use tracing_subscriber::EnvFilter;
1818
mod codex_tool_config;
1919
mod codex_tool_runner;
2020
mod conversation_loop;
21+
mod error_code;
2122
mod exec_approval;
2223
mod json_to_toml;
2324
pub mod mcp_protocol;

codex-rs/mcp-server/src/message_processor.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use crate::codex_tool_config::CodexToolCallParam;
77
use crate::codex_tool_config::CodexToolCallReplyParam;
88
use crate::codex_tool_config::create_tool_for_codex_tool_call_param;
99
use crate::codex_tool_config::create_tool_for_codex_tool_call_reply_param;
10+
use crate::error_code::INVALID_REQUEST_ERROR_CODE;
1011
use crate::mcp_protocol::ToolCallRequestParams;
1112
use crate::mcp_protocol::ToolCallResponse;
1213
use crate::mcp_protocol::ToolCallResponseResult;
@@ -191,7 +192,7 @@ impl MessageProcessor {
191192
if self.initialized {
192193
// Already initialised: send JSON-RPC error response.
193194
let error = JSONRPCErrorError {
194-
code: -32600, // Invalid Request
195+
code: INVALID_REQUEST_ERROR_CODE,
195196
message: "initialize called more than once".to_string(),
196197
data: None,
197198
};
@@ -230,9 +231,6 @@ impl MessageProcessor {
230231
where
231232
T: ModelContextProtocolRequest,
232233
{
233-
// result has `Serialized` instance so should never fail
234-
#[expect(clippy::unwrap_used)]
235-
let result = serde_json::to_value(result).unwrap();
236234
self.outgoing.send_response(id, result).await;
237235
}
238236

@@ -533,9 +531,7 @@ impl MessageProcessor {
533531
is_error: Some(true),
534532
structured_content: None,
535533
};
536-
outgoing
537-
.send_response(request_id, serde_json::to_value(result).unwrap_or_default())
538-
.await;
534+
outgoing.send_response(request_id, result).await;
539535
return;
540536
}
541537
};

codex-rs/mcp-server/src/outgoing_message.rs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ use tokio::sync::mpsc;
1818
use tokio::sync::oneshot;
1919
use tracing::warn;
2020

21+
use crate::error_code::INTERNAL_ERROR_CODE;
22+
2123
/// Sends messages to the client and manages request callbacks.
2224
pub(crate) struct OutgoingMessageSender {
2325
next_request_id: AtomicI64,
@@ -74,9 +76,24 @@ impl OutgoingMessageSender {
7476
}
7577
}
7678

77-
pub(crate) async fn send_response(&self, id: RequestId, result: Result) {
78-
let outgoing_message = OutgoingMessage::Response(OutgoingResponse { id, result });
79-
let _ = self.sender.send(outgoing_message).await;
79+
pub(crate) async fn send_response<T: Serialize>(&self, id: RequestId, response: T) {
80+
match serde_json::to_value(response) {
81+
Ok(result) => {
82+
let outgoing_message = OutgoingMessage::Response(OutgoingResponse { id, result });
83+
let _ = self.sender.send(outgoing_message).await;
84+
}
85+
Err(err) => {
86+
self.send_error(
87+
id,
88+
JSONRPCErrorError {
89+
code: INTERNAL_ERROR_CODE,
90+
message: format!("failed to serialize response: {err}"),
91+
data: None,
92+
},
93+
)
94+
.await;
95+
}
96+
}
8097
}
8198

8299
pub(crate) async fn send_event_as_notification(

0 commit comments

Comments
 (0)