remote_mcp_kernel/microkernel/
factory.rs

1//! Factory functions for microkernel server creation
2//!
3//! This module provides convenient factory functions for creating
4//! microkernel servers with different OAuth providers and configurations.
5
6use 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
19/// Create a fully configured microkernel server with all handlers
20pub 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
37/// Create a fully configured microkernel server with GitHub OAuth provider
38pub 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
53/// Create a fully configured microkernel server with Cognito OAuth provider
54pub 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
69/// Create a minimal microkernel server with GitHub OAuth provider
70pub 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
77/// Create a minimal microkernel server with Cognito OAuth provider
78pub 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
85/// Create a fully configured microkernel server with Cognito OAuth provider and DynamoDB storage
86pub 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    // Create DynamoDB storage
95    let (storage, client_manager) =
96        create_dynamodb_storage(table_name, create_table, Some("expires_at".to_string())).await?;
97
98    // Create Cognito OAuth provider with DynamoDB storage
99    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    // Create all MCP handlers
111    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    // Build and return the microkernel server
117    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
125/// Create a minimal microkernel server with only OAuth
126pub 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
135/// Create a microkernel server without authentication (for testing)
136pub 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}