Skip to main content

mcp_kit/server/
extract.rs

1/// Extractors for tool/resource/prompt handlers — inspired by axum's extractor pattern.
2use crate::error::{McpError, McpResult};
3use serde::de::DeserializeOwned;
4
5// ─── Json<T> extractor ────────────────────────────────────────────────────────
6
7/// Deserialize the full arguments object as type `T`.
8pub struct Json<T>(pub T);
9
10impl<T: DeserializeOwned> Json<T> {
11    pub fn from_value(v: serde_json::Value) -> McpResult<Self> {
12        serde_json::from_value(v)
13            .map(Json)
14            .map_err(|e| McpError::InvalidParams(e.to_string()))
15    }
16}
17
18impl<T> std::ops::Deref for Json<T> {
19    type Target = T;
20    fn deref(&self) -> &Self::Target {
21        &self.0
22    }
23}
24
25// ─── State<S> extractor ───────────────────────────────────────────────────────
26
27/// Share arbitrary state across handlers.
28#[derive(Clone)]
29pub struct State<S>(pub S);
30
31impl<S> std::ops::Deref for State<S> {
32    type Target = S;
33    fn deref(&self) -> &Self::Target {
34        &self.0
35    }
36}
37
38// ─── Extension<T> extractor ───────────────────────────────────────────────────
39
40/// Type-map extension data attached to a session.
41#[derive(Clone)]
42pub struct Extension<T>(pub T);
43
44impl<T> std::ops::Deref for Extension<T> {
45    type Target = T;
46    fn deref(&self) -> &Self::Target {
47        &self.0
48    }
49}