Skip to content

Commit 6a42304

Browse files
authored
feat: extensions to context (#102)
1 parent 938ecbe commit 6a42304

File tree

4 files changed

+43
-9
lines changed

4 files changed

+43
-9
lines changed

crates/rmcp/src/model.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,15 @@ pub struct Request<M = String, P = JsonObject> {
200200
pub extensions: Extensions,
201201
}
202202

203+
impl<M, P> GetExtensions for Request<M, P> {
204+
fn extensions(&self) -> &Extensions {
205+
&self.extensions
206+
}
207+
fn extensions_mut(&mut self) -> &mut Extensions {
208+
&mut self.extensions
209+
}
210+
}
211+
203212
#[derive(Debug, Clone)]
204213
pub struct RequestOptionalParam<M = String, P = JsonObject> {
205214
pub method: M,
@@ -220,6 +229,14 @@ pub struct RequestNoParam<M = String> {
220229
pub extensions: Extensions,
221230
}
222231

232+
impl<M> GetExtensions for RequestNoParam<M> {
233+
fn extensions(&self) -> &Extensions {
234+
&self.extensions
235+
}
236+
fn extensions_mut(&mut self) -> &mut Extensions {
237+
&mut self.extensions
238+
}
239+
}
223240
#[derive(Debug, Clone)]
224241
pub struct Notification<M = String, P = JsonObject> {
225242
pub method: M,

crates/rmcp/src/model/meta.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,26 @@ pub trait GetMeta {
1313
fn get_meta(&self) -> &Meta;
1414
}
1515

16+
pub trait GetExtensions {
17+
fn extensions(&self) -> &Extensions;
18+
fn extensions_mut(&mut self) -> &mut Extensions;
19+
}
20+
1621
macro_rules! variant_extension {
1722
(
1823
$Enum: ident {
1924
$($variant: ident)*
2025
}
2126
) => {
22-
impl $Enum {
23-
pub fn extensions(&self) -> &Extensions {
27+
impl GetExtensions for $Enum {
28+
fn extensions(&self) -> &Extensions {
2429
match self {
2530
$(
2631
$Enum::$variant(v) => &v.extensions,
2732
)*
2833
}
2934
}
30-
pub fn extensions_mut(&mut self) -> &mut Extensions {
35+
fn extensions_mut(&mut self) -> &mut Extensions {
3136
match self {
3237
$(
3338
$Enum::$variant(v) => &mut v.extensions,

crates/rmcp/src/service.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ use thiserror::Error;
44
use crate::{
55
error::Error as McpError,
66
model::{
7-
CancelledNotification, CancelledNotificationParam, GetMeta, JsonRpcBatchRequestItem,
8-
JsonRpcBatchResponseItem, JsonRpcError, JsonRpcMessage, JsonRpcNotification,
9-
JsonRpcRequest, JsonRpcResponse, Meta, NumberOrString, ProgressToken, RequestId,
10-
ServerJsonRpcMessage,
7+
CancelledNotification, CancelledNotificationParam, Extensions, GetExtensions, GetMeta,
8+
JsonRpcBatchRequestItem, JsonRpcBatchResponseItem, JsonRpcError, JsonRpcMessage,
9+
JsonRpcNotification, JsonRpcRequest, JsonRpcResponse, Meta, NumberOrString, ProgressToken,
10+
RequestId, ServerJsonRpcMessage,
1111
},
1212
transport::IntoTransport,
1313
};
@@ -59,12 +59,12 @@ impl<T> TransferObject for T where
5959

6060
#[allow(private_bounds, reason = "there's no the third implementation")]
6161
pub trait ServiceRole: std::fmt::Debug + Send + Sync + 'static + Copy + Clone {
62-
type Req: TransferObject + GetMeta;
62+
type Req: TransferObject + GetMeta + GetExtensions;
6363
type Resp: TransferObject;
6464
type Not: TryInto<CancelledNotification, Error = Self::Not>
6565
+ From<CancelledNotification>
6666
+ TransferObject;
67-
type PeerReq: TransferObject + GetMeta;
67+
type PeerReq: TransferObject + GetMeta + GetExtensions;
6868
type PeerResp: TransferObject;
6969
type PeerNot: TryInto<CancelledNotification, Error = Self::PeerNot>
7070
+ From<CancelledNotification>
@@ -471,6 +471,7 @@ pub struct RequestContext<R: ServiceRole> {
471471
pub ct: CancellationToken,
472472
pub id: RequestId,
473473
pub meta: Meta,
474+
pub extensions: Extensions,
474475
/// An interface to fetch the remote client or server
475476
pub peer: Peer<R>,
476477
}
@@ -667,6 +668,7 @@ where
667668
id: id.clone(),
668669
peer: peer.clone(),
669670
meta: request.get_meta().clone(),
671+
extensions: request.extensions().clone(),
670672
};
671673
tokio::spawn(async move {
672674
let result = service.handle_request(request, context).await;

crates/rmcp/tests/test_message_protocol.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ async fn test_context_inclusion_integration() -> anyhow::Result<()> {
7171
ct: CancellationToken::new(),
7272
id: NumberOrString::Number(1),
7373
meta: Default::default(),
74+
extensions: Default::default(),
7475
},
7576
)
7677
.await?;
@@ -112,6 +113,7 @@ async fn test_context_inclusion_integration() -> anyhow::Result<()> {
112113
ct: CancellationToken::new(),
113114
id: NumberOrString::Number(2),
114115
meta: Default::default(),
116+
extensions: Default::default(),
115117
},
116118
)
117119
.await?;
@@ -153,6 +155,7 @@ async fn test_context_inclusion_integration() -> anyhow::Result<()> {
153155
ct: CancellationToken::new(),
154156
id: NumberOrString::Number(3),
155157
meta: Default::default(),
158+
extensions: Default::default(),
156159
},
157160
)
158161
.await?;
@@ -214,6 +217,7 @@ async fn test_context_inclusion_ignored_integration() -> anyhow::Result<()> {
214217
ct: CancellationToken::new(),
215218
id: NumberOrString::Number(1),
216219
meta: Meta::default(),
220+
extensions: Default::default(),
217221
},
218222
)
219223
.await?;
@@ -280,6 +284,7 @@ async fn test_message_sequence_integration() -> anyhow::Result<()> {
280284
ct: CancellationToken::new(),
281285
id: NumberOrString::Number(1),
282286
meta: Meta::default(),
287+
extensions: Default::default(),
283288
},
284289
)
285290
.await?;
@@ -354,6 +359,7 @@ async fn test_message_sequence_validation_integration() -> anyhow::Result<()> {
354359
ct: CancellationToken::new(),
355360
id: NumberOrString::Number(1),
356361
meta: Meta::default(),
362+
extensions: Default::default(),
357363
},
358364
)
359365
.await?;
@@ -387,6 +393,7 @@ async fn test_message_sequence_validation_integration() -> anyhow::Result<()> {
387393
ct: CancellationToken::new(),
388394
id: NumberOrString::Number(2),
389395
meta: Meta::default(),
396+
extensions: Default::default(),
390397
},
391398
)
392399
.await;
@@ -439,6 +446,7 @@ async fn test_selective_context_handling_integration() -> anyhow::Result<()> {
439446
ct: CancellationToken::new(),
440447
id: NumberOrString::Number(1),
441448
meta: Meta::default(),
449+
extensions: Default::default(),
442450
},
443451
)
444452
.await?;
@@ -478,6 +486,7 @@ async fn test_selective_context_handling_integration() -> anyhow::Result<()> {
478486
ct: CancellationToken::new(),
479487
id: NumberOrString::Number(2),
480488
meta: Meta::default(),
489+
extensions: Default::default(),
481490
},
482491
)
483492
.await?;
@@ -534,6 +543,7 @@ async fn test_context_inclusion() -> anyhow::Result<()> {
534543
ct: CancellationToken::new(),
535544
id: NumberOrString::Number(1),
536545
meta: Meta::default(),
546+
extensions: Default::default(),
537547
},
538548
)
539549
.await?;

0 commit comments

Comments
 (0)