using Svrnty.MCP.Gateway.Core.Models;
using Svrnty.MCP.Gateway.Infrastructure.Routing;
using Svrnty.MCP.Gateway.Infrastructure.Connection;
using Svrnty.MCP.Gateway.Infrastructure.Security;
using Svrnty.MCP.Gateway.Core.Interfaces;
namespace CodexMcpGateway;
///
/// Sample MCP Gateway application demonstrating gateway capabilities.
/// Routes requests to multiple MCP servers with load balancing and health monitoring.
///
class Program
{
static async Task Main(string[] args)
{
Console.WriteLine("=== CODEX MCP Gateway Sample ===");
Console.WriteLine("Gateway routes requests to MCP servers via HTTP transport\n");
// Step 1: Create connection pool
var connectionPool = new ServerConnectionPool
{
MaxConnectionsPerServer = 10,
IdleTimeout = TimeSpan.FromMinutes(5)
};
// Step 2: Choose routing strategy
Console.WriteLine("Select routing strategy:");
Console.WriteLine("1. Round Robin (default)");
Console.WriteLine("2. Tool-based routing");
Console.WriteLine("3. Client-based routing");
Console.Write("\nChoice (1-3): ");
var choice = Console.ReadLine();
IRoutingStrategy strategy = choice switch
{
"2" => new ToolBasedStrategy(new Dictionary
{
["search_*"] = "codex-server-1",
["get_document"] = "codex-server-2",
["*"] = "codex-server-1"
}),
"3" => new ClientBasedStrategy(new Dictionary
{
["client-a"] = "codex-server-1",
["client-b"] = "codex-server-2"
}),
_ => new RoundRobinStrategy()
};
Console.WriteLine($"Using {strategy.GetType().Name}\n");
// Step 3: Create gateway router
var router = new GatewayRouter(strategy, connectionPool);
// Step 4: Register MCP servers
Console.WriteLine("Registering MCP servers...");
var server1 = new ServerConfig
{
Id = "codex-server-1",
Name = "CODEX MCP Server 1",
TransportType = "Http",
BaseUrl = "http://localhost:5050",
Enabled = true
};
await router.RegisterServerAsync(server1);
Console.WriteLine($" ✓ Registered: {server1.Name} ({server1.BaseUrl})");
// Step 5: Check server health
Console.WriteLine("\nChecking server health...");
var health = await router.GetServerHealthAsync();
foreach (var serverHealth in health)
{
var status = serverHealth.IsHealthy ? "✓ Healthy" : "✗ Unhealthy";
Console.WriteLine($" {status}: {serverHealth.ServerName}");
}
// Step 6: Demonstrate request routing
Console.WriteLine("\n--- Simulating Gateway Requests ---\n");
Console.WriteLine("Request 1: search_codex");
var request1 = new GatewayRequest
{
ToolName = "search_codex",
Arguments = new Dictionary
{
["query"] = "Model Context Protocol",
["maxResults"] = 5
},
ClientId = "demo-client"
};
try
{
var response1 = await router.RouteAsync(request1);
Console.WriteLine($" Response: {(response1.Success ? "Success" : "Failed")}");
Console.WriteLine($" Routed to: {response1.ServerId}");
if (!response1.Success)
{
Console.WriteLine($" Error: {response1.Error}");
}
}
catch (Exception ex)
{
Console.WriteLine($" Error: {ex.Message}");
}
// Step 7: Demonstrate authentication
Console.WriteLine("\n--- Testing Authentication ---\n");
var apiKeyProvider = new ApiKeyAuthProvider(new Dictionary
{
["demo-client"] = "secret-key-123"
});
var authContext = new AuthenticationContext
{
ClientId = "demo-client",
Credentials = "secret-key-123"
};
var authResult = await apiKeyProvider.AuthenticateAsync(authContext);
Console.WriteLine($"Authentication: {(authResult.IsAuthenticated ? "✓ Success" : "✗ Failed")}");
// Step 8: Show statistics
Console.WriteLine("\n--- Gateway Statistics ---\n");
var poolStats = connectionPool.GetPoolStats();
Console.WriteLine($"Connection Pool:");
Console.WriteLine($" Total connections: {poolStats.TotalConnections}");
Console.WriteLine($" Active connections: {poolStats.ActiveConnections}");
Console.WriteLine($" Idle connections: {poolStats.IdleConnections}");
Console.WriteLine("\n=== Sample Complete ===");
}
}