mcp_core_rs/utils/
parse_message.rs

1use mcp_error_rs::{Error, Result};
2
3use crate::protocol::{
4    constants::{JSONRPC_EXPECTED_VERSION, JSONRPC_VERSION_FIELD},
5    message::JsonRpcMessage,
6};
7
8/// Parses a JSON-RPC message from a string, validating structure and version.
9pub fn parse_json_rpc_message(line: &str) -> Result<JsonRpcMessage> {
10    let value: serde_json::Value = serde_json::from_str(line)?;
11    if !value.is_object() {
12        return Err(Error::InvalidMessage(
13            "Message must be a JSON object".into(),
14        ));
15    }
16    let obj = value.as_object().unwrap();
17
18    match obj.get(JSONRPC_VERSION_FIELD) {
19        Some(serde_json::Value::String(v)) if v == JSONRPC_EXPECTED_VERSION => {}
20        _ => {
21            return Err(Error::InvalidMessage(
22                "Missing or invalid jsonrpc version".into(),
23            ));
24        }
25    }
26
27    let msg = serde_json::from_value(value)?;
28    Ok(msg)
29}