mcp_core/transport/
mod.rs1use std::{future::Future, pin::Pin};
7
8use anyhow::Result;
9use async_trait::async_trait;
10use serde::{Deserialize, Serialize};
11
12mod client;
13pub use client::*;
14
15mod server;
16pub use server::*;
17
18use crate::protocol::RequestOptions;
19
20pub type Message = JsonRpcMessage;
23
24#[async_trait()]
25pub trait Transport: Send + Sync + 'static {
26 async fn open(&self) -> Result<()>;
28
29 async fn close(&self) -> Result<()>;
31
32 async fn poll_message(&self) -> Result<Option<Message>>;
33
34 fn request(
35 &self,
36 method: &str,
37 params: Option<serde_json::Value>,
38 options: RequestOptions,
39 ) -> Pin<Box<dyn Future<Output = Result<JsonRpcResponse>> + Send + Sync>>;
40
41 async fn send_notification(
42 &self,
43 method: &str,
44 params: Option<serde_json::Value>,
45 ) -> Result<()>;
46
47 async fn send_response(
48 &self,
49 id: RequestId,
50 result: Option<serde_json::Value>,
51 error: Option<JsonRpcError>,
52 ) -> Result<()>;
53}
54
55pub type RequestId = u64;
57#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
59#[serde(transparent)]
60pub struct JsonRpcVersion(String);
61
62impl Default for JsonRpcVersion {
63 fn default() -> Self {
64 JsonRpcVersion("2.0".to_owned())
65 }
66}
67
68impl JsonRpcVersion {
69 pub fn as_str(&self) -> &str {
70 &self.0
71 }
72}
73
74#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
75#[serde(deny_unknown_fields)]
76#[serde(untagged)]
77pub enum JsonRpcMessage {
78 Response(JsonRpcResponse),
79 Request(JsonRpcRequest),
80 Notification(JsonRpcNotification),
81}
82
83#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
85#[serde(deny_unknown_fields)]
86pub struct JsonRpcRequest {
87 pub id: RequestId,
88 pub method: String,
89 #[serde(skip_serializing_if = "Option::is_none")]
90 pub params: Option<serde_json::Value>,
91 pub jsonrpc: JsonRpcVersion,
92}
93
94#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
95#[serde(rename_all = "camelCase")]
96#[serde(deny_unknown_fields)]
97#[serde(default)]
98pub struct JsonRpcNotification {
99 pub method: String,
100 #[serde(skip_serializing_if = "Option::is_none")]
101 pub params: Option<serde_json::Value>,
102 pub jsonrpc: JsonRpcVersion,
103}
104
105#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
106#[serde(deny_unknown_fields)]
107#[serde(rename_all = "camelCase")]
108#[serde(default)]
109pub struct JsonRpcResponse {
110 pub id: RequestId,
112 #[serde(skip_serializing_if = "Option::is_none")]
114 pub result: Option<serde_json::Value>,
115 #[serde(skip_serializing_if = "Option::is_none")]
117 pub error: Option<JsonRpcError>,
118 pub jsonrpc: JsonRpcVersion,
120}
121
122#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
123#[serde(rename_all = "camelCase")]
124#[serde(default)]
125pub struct JsonRpcError {
126 pub code: i32,
128 pub message: String,
130 #[serde(skip_serializing_if = "Option::is_none")]
132 pub data: Option<serde_json::Value>,
133}