remote_mcp_kernel/microkernel/
factory.rs1use crate::handlers::{McpServer, SseHandler, SseHandlerConfig, StreamableHttpHandler};
7use oauth_provider_rs::storage::create_dynamodb_storage;
8use oauth_provider_rs::{
9 CognitoOAuthProvider, DefaultClientManager, GitHubOAuthProvider, OAuthProvider,
10 OAuthProviderTrait, OAuthStorage, http_integration::config::OAuthProviderConfig,
11 storage::DynamoDBStorage,
12};
13
14use super::{
15 core::MicrokernelServer,
16 types::{CognitoMicrokernelServer, CognitoMicrokernelServerDynamoDB, GitHubMicrokernelServer},
17};
18
19pub fn create_full_microkernel<
21 P: OAuthProviderTrait<S, DefaultClientManager<S>> + 'static,
22 S: OAuthStorage + Clone + 'static,
23>(
24 oauth_provider: OAuthProvider<P, S>,
25) -> MicrokernelServer<P, S> {
26 let mcp_server = McpServer::new();
27 let streamable_handler = StreamableHttpHandler::new(mcp_server.clone());
28 let sse_handler = SseHandler::new(mcp_server.clone());
29 let sse_config = SseHandlerConfig::default();
30
31 MicrokernelServer::new()
32 .with_oauth_provider(oauth_provider)
33 .with_streamable_handler(streamable_handler)
34 .with_sse_handler(sse_handler, sse_config)
35}
36
37pub fn create_full_github_microkernel(
39 oauth_provider: GitHubOAuthProvider,
40) -> GitHubMicrokernelServer {
41 let wrapped_oauth_provider = OAuthProvider::new(oauth_provider, OAuthProviderConfig::default());
42 let mcp_server = McpServer::new();
43 let streamable_handler = StreamableHttpHandler::new(mcp_server.clone());
44 let sse_handler = SseHandler::new(mcp_server.clone());
45 let sse_config = SseHandlerConfig::default();
46
47 MicrokernelServer::new()
48 .with_oauth_provider(wrapped_oauth_provider)
49 .with_streamable_handler(streamable_handler)
50 .with_sse_handler(sse_handler, sse_config)
51}
52
53pub fn create_full_cognito_microkernel(
55 oauth_provider: CognitoOAuthProvider,
56) -> CognitoMicrokernelServer {
57 let wrapped_oauth_provider = OAuthProvider::new(oauth_provider, OAuthProviderConfig::default());
58 let mcp_server = McpServer::new();
59 let streamable_handler = StreamableHttpHandler::new(mcp_server.clone());
60 let sse_handler = SseHandler::new(mcp_server.clone());
61 let sse_config = SseHandlerConfig::default();
62
63 MicrokernelServer::new()
64 .with_oauth_provider(wrapped_oauth_provider)
65 .with_streamable_handler(streamable_handler)
66 .with_sse_handler(sse_handler, sse_config)
67}
68
69pub fn create_github_oauth_only_microkernel(
71 oauth_provider: GitHubOAuthProvider,
72) -> GitHubMicrokernelServer {
73 let wrapped_oauth_provider = OAuthProvider::new(oauth_provider, OAuthProviderConfig::default());
74 MicrokernelServer::new().with_oauth_provider(wrapped_oauth_provider)
75}
76
77pub fn create_cognito_oauth_only_microkernel(
79 oauth_provider: CognitoOAuthProvider,
80) -> CognitoMicrokernelServer {
81 let wrapped_oauth_provider = OAuthProvider::new(oauth_provider, OAuthProviderConfig::default());
82 MicrokernelServer::new().with_oauth_provider(wrapped_oauth_provider)
83}
84
85pub async fn create_full_cognito_microkernel_dynamodb(
87 cognito_config: oauth_provider_rs::provider_trait::OAuthProviderConfig,
88 cognito_domain: String,
89 region: String,
90 user_pool_id: String,
91 table_name: String,
92 create_table: bool,
93) -> Result<CognitoMicrokernelServerDynamoDB<DynamoDBStorage>, Box<dyn std::error::Error>> {
94 let (storage, client_manager) =
96 create_dynamodb_storage(table_name, create_table, Some("expires_at".to_string())).await?;
97
98 let oauth_handler = oauth_provider_rs::CognitoOAuthHandler::new_simple(
100 storage,
101 client_manager,
102 cognito_config,
103 cognito_domain,
104 region,
105 user_pool_id,
106 );
107
108 let oauth_provider = OAuthProvider::new(oauth_handler, OAuthProviderConfig::default());
109
110 let mcp_server = McpServer::new();
112 let streamable_handler = StreamableHttpHandler::new(mcp_server.clone());
113 let sse_handler = SseHandler::new(mcp_server.clone());
114 let sse_config = SseHandlerConfig::default();
115
116 let microkernel = MicrokernelServer::new()
118 .with_oauth_provider(oauth_provider)
119 .with_streamable_handler(streamable_handler)
120 .with_sse_handler(sse_handler, sse_config);
121
122 Ok(microkernel)
123}
124
125pub fn create_oauth_only_microkernel<
127 P: OAuthProviderTrait<S, DefaultClientManager<S>> + 'static,
128 S: OAuthStorage + Clone + 'static,
129>(
130 oauth_provider: OAuthProvider<P, S>,
131) -> MicrokernelServer<P, S> {
132 MicrokernelServer::new().with_oauth_provider(oauth_provider)
133}
134
135pub fn create_unauthenticated_microkernel<
137 P: OAuthProviderTrait<S, DefaultClientManager<S>> + 'static,
138 S: OAuthStorage + Clone + 'static,
139>(
140 oauth_provider: OAuthProvider<P, S>,
141) -> MicrokernelServer<P, S> {
142 let mcp_server = McpServer::new();
143 let streamable_handler = StreamableHttpHandler::new(mcp_server.clone());
144 let sse_handler = SseHandler::new(mcp_server.clone());
145 let sse_config = SseHandlerConfig {
146 require_auth: false,
147 ..Default::default()
148 };
149
150 MicrokernelServer::new()
151 .with_oauth_provider(oauth_provider)
152 .with_streamable_handler(streamable_handler)
153 .with_sse_handler(sse_handler, sse_config)
154}