|
5 | 5 | //! |
6 | 6 | //! ## Usage |
7 | 7 | //! |
8 | | -//! Create an MCP server from an rmcp service: |
| 8 | +//! Create an MCP server from an rmcp service using the extension trait: |
9 | 9 | //! |
10 | 10 | //! ```ignore |
11 | 11 | //! use sacp::mcp_server::McpServer; |
12 | | -//! use sacp_rmcp::RmcpServer; |
| 12 | +//! use sacp_rmcp::McpServerExt; |
13 | 13 | //! |
14 | | -//! let server = McpServer::new(RmcpServer::new("my-server", || MyRmcpService::new())); |
| 14 | +//! let server = McpServer::from_rmcp("my-server", MyRmcpService::new); |
15 | 15 | //! |
16 | 16 | //! // Use as a handler |
17 | 17 | //! ProxyToConductor::builder() |
|
21 | 21 | //! ``` |
22 | 22 |
|
23 | 23 | use rmcp::ServiceExt; |
24 | | -use sacp::mcp_server::{McpContext, McpServerConnect}; |
25 | | -use sacp::{ByteStreams, Component, DynComponent, JrRole}; |
| 24 | +use sacp::mcp_server::{McpContext, McpServer, McpServerConnect}; |
| 25 | +use sacp::{Agent, ByteStreams, Component, DynComponent, HasEndpoint, JrRole}; |
26 | 26 | use tokio_util::compat::{TokioAsyncReadCompatExt, TokioAsyncWriteCompatExt}; |
27 | 27 |
|
28 | | -/// Wrapper that implements [`McpServerConnect`] for rmcp services. |
29 | | -/// |
30 | | -/// Use this to integrate existing rmcp-based MCP servers with the SACP framework. |
31 | | -/// |
32 | | -/// # Example |
33 | | -/// |
34 | | -/// ```ignore |
35 | | -/// use sacp::mcp_server::McpServer; |
36 | | -/// use sacp_rmcp::RmcpServer; |
37 | | -/// |
38 | | -/// // Create an MCP server from an rmcp service factory |
39 | | -/// let server = McpServer::new(RmcpServer::new("my-server", || MyRmcpService::new())); |
40 | | -/// ``` |
41 | | -pub struct RmcpServer<F> { |
42 | | - name: String, |
43 | | - make_service: F, |
44 | | -} |
45 | | - |
46 | | -impl<F> RmcpServer<F> { |
47 | | - /// Create a new rmcp server wrapper. |
| 28 | +pub trait McpServerExt<Role: JrRole> |
| 29 | +where |
| 30 | + Role: HasEndpoint<Agent>, |
| 31 | +{ |
| 32 | + /// Create an MCP server from something that implements the [`McpServerConnect`] trait. |
48 | 33 | /// |
49 | | - /// # Parameters |
| 34 | + /// # See also |
50 | 35 | /// |
51 | | - /// - `name`: The name of the server (used in session responses). |
52 | | - /// - `make_service`: A function that creates a new rmcp service instance. |
53 | | - /// This is called for each new connection. |
54 | | - pub fn new(name: impl ToString, make_service: F) -> Self { |
55 | | - Self { |
56 | | - name: name.to_string(), |
57 | | - make_service, |
| 36 | + /// See [`Self::builder`] to construct MCP servers from Rust code. |
| 37 | + fn from_rmcp<S>( |
| 38 | + name: impl ToString, |
| 39 | + new_fn: impl Fn() -> S + Send + Sync + 'static, |
| 40 | + ) -> McpServer<Role> |
| 41 | + where |
| 42 | + S: rmcp::Service<rmcp::RoleServer>, |
| 43 | + { |
| 44 | + struct RmcpServer<F> { |
| 45 | + name: String, |
| 46 | + new_fn: F, |
58 | 47 | } |
59 | | - } |
60 | | -} |
61 | 48 |
|
62 | | -impl<Role, F, S> McpServerConnect<Role> for RmcpServer<F> |
63 | | -where |
64 | | - Role: JrRole, |
65 | | - F: Fn() -> S + Send + Sync + 'static, |
66 | | - S: rmcp::Service<rmcp::RoleServer>, |
67 | | -{ |
68 | | - fn name(&self) -> String { |
69 | | - self.name.clone() |
70 | | - } |
| 49 | + impl<Role, F, S> McpServerConnect<Role> for RmcpServer<F> |
| 50 | + where |
| 51 | + Role: JrRole, |
| 52 | + F: Fn() -> S + Send + Sync + 'static, |
| 53 | + S: rmcp::Service<rmcp::RoleServer>, |
| 54 | + { |
| 55 | + fn name(&self) -> String { |
| 56 | + self.name.clone() |
| 57 | + } |
71 | 58 |
|
72 | | - fn connect(&self, _cx: McpContext<Role>) -> DynComponent { |
73 | | - let service = (self.make_service)(); |
74 | | - DynComponent::new(RmcpServerComponent { service }) |
| 59 | + fn connect(&self, _cx: McpContext<Role>) -> DynComponent { |
| 60 | + let service = (self.new_fn)(); |
| 61 | + DynComponent::new(RmcpServerComponent { service }) |
| 62 | + } |
| 63 | + } |
| 64 | + |
| 65 | + McpServer::new(RmcpServer { |
| 66 | + name: name.to_string(), |
| 67 | + new_fn, |
| 68 | + }) |
75 | 69 | } |
76 | 70 | } |
77 | 71 |
|
| 72 | +impl<Role: JrRole> McpServerExt<Role> for McpServer<Role> where Role: HasEndpoint<Agent> {} |
| 73 | + |
78 | 74 | /// Component wrapper for rmcp services. |
79 | 75 | struct RmcpServerComponent<S> { |
80 | 76 | service: S, |
|
0 commit comments