fix: remove mcp-types from app server protocol (#4537)
We continue the separation between `codex app-server` and `codex
mcp-server`.
In particular, we introduce a new crate, `codex-app-server-protocol`,
and migrate `codex-rs/protocol/src/mcp_protocol.rs` into it, renaming it
`codex-rs/app-server-protocol/src/protocol.rs`.
Because `ConversationId` was defined in `mcp_protocol.rs`, we move it
into its own file, `codex-rs/protocol/src/conversation_id.rs`, and
because it is referenced in a ton of places, we have to touch a lot of
files as part of this PR.
We also decide to get away from proper JSON-RPC 2.0 semantics, so we
also introduce `codex-rs/app-server-protocol/src/jsonrpc_lite.rs`, which
is basically the same `JSONRPCMessage` type defined in `mcp-types`
except with all of the `"jsonrpc": "2.0"` removed.
Getting rid of `"jsonrpc": "2.0"` makes our serialization logic
considerably simpler, as we can lean heavier on serde to serialize
directly into the wire format that we use now.
2025-09-30 19:16:26 -07:00
|
|
|
//! We do not do true JSON-RPC 2.0, as we neither send nor expect the
|
|
|
|
|
//! "jsonrpc": "2.0" field.
|
|
|
|
|
|
|
|
|
|
use serde::Deserialize;
|
|
|
|
|
use serde::Serialize;
|
|
|
|
|
use ts_rs::TS;
|
|
|
|
|
|
|
|
|
|
pub const JSONRPC_VERSION: &str = "2.0";
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Hash, Eq, TS)]
|
|
|
|
|
#[serde(untagged)]
|
|
|
|
|
pub enum RequestId {
|
|
|
|
|
String(String),
|
2025-10-01 12:10:20 -07:00
|
|
|
#[ts(type = "number")]
|
fix: remove mcp-types from app server protocol (#4537)
We continue the separation between `codex app-server` and `codex
mcp-server`.
In particular, we introduce a new crate, `codex-app-server-protocol`,
and migrate `codex-rs/protocol/src/mcp_protocol.rs` into it, renaming it
`codex-rs/app-server-protocol/src/protocol.rs`.
Because `ConversationId` was defined in `mcp_protocol.rs`, we move it
into its own file, `codex-rs/protocol/src/conversation_id.rs`, and
because it is referenced in a ton of places, we have to touch a lot of
files as part of this PR.
We also decide to get away from proper JSON-RPC 2.0 semantics, so we
also introduce `codex-rs/app-server-protocol/src/jsonrpc_lite.rs`, which
is basically the same `JSONRPCMessage` type defined in `mcp-types`
except with all of the `"jsonrpc": "2.0"` removed.
Getting rid of `"jsonrpc": "2.0"` makes our serialization logic
considerably simpler, as we can lean heavier on serde to serialize
directly into the wire format that we use now.
2025-09-30 19:16:26 -07:00
|
|
|
Integer(i64),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub type Result = serde_json::Value;
|
|
|
|
|
|
|
|
|
|
/// Refers to any valid JSON-RPC object that can be decoded off the wire, or encoded to be sent.
|
|
|
|
|
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
|
|
|
|
|
#[serde(untagged)]
|
|
|
|
|
pub enum JSONRPCMessage {
|
|
|
|
|
Request(JSONRPCRequest),
|
|
|
|
|
Notification(JSONRPCNotification),
|
|
|
|
|
Response(JSONRPCResponse),
|
|
|
|
|
Error(JSONRPCError),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// A request that expects a response.
|
|
|
|
|
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
|
|
|
|
|
pub struct JSONRPCRequest {
|
|
|
|
|
pub id: RequestId,
|
|
|
|
|
pub method: String,
|
|
|
|
|
#[serde(default, skip_serializing_if = "Option::is_none")]
|
|
|
|
|
pub params: Option<serde_json::Value>,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// A notification which does not expect a response.
|
|
|
|
|
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
|
|
|
|
|
pub struct JSONRPCNotification {
|
|
|
|
|
pub method: String,
|
|
|
|
|
#[serde(default, skip_serializing_if = "Option::is_none")]
|
|
|
|
|
pub params: Option<serde_json::Value>,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// A successful (non-error) response to a request.
|
|
|
|
|
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
|
|
|
|
|
pub struct JSONRPCResponse {
|
|
|
|
|
pub id: RequestId,
|
|
|
|
|
pub result: Result,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// A response to a request that indicates an error occurred.
|
|
|
|
|
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
|
|
|
|
|
pub struct JSONRPCError {
|
|
|
|
|
pub error: JSONRPCErrorError,
|
|
|
|
|
pub id: RequestId,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
|
|
|
|
|
pub struct JSONRPCErrorError {
|
|
|
|
|
pub code: i64,
|
|
|
|
|
#[serde(default, skip_serializing_if = "Option::is_none")]
|
|
|
|
|
pub data: Option<serde_json::Value>,
|
|
|
|
|
pub message: String,
|
|
|
|
|
}
|