A comprehensive platform for managing and proxying Model Context Protocol (MCP) servers, providing scalable AI service orchestration across multiple microservices.
SUSE AI Universal Proxy is a comprehensive MCP proxy system that aggregates, manages, and orchestrates multiple MCP servers. It provides a unified end...
54@app.tool()
55def get_server_info() -> dict:
56 """Get server information"""
57 auth_required = transport == "http"
58 return {
59 "name": server_name,
60 "version": "1.0.0",
61 "description": "Example MCP server",
62 "auth_required": auth_required,
63 "auth_method": "Bearer token" if auth_required else None,
64 "token_format": "Authorization: Bearer <token>" if auth_required else None,
65 "expected_token": AUTH_TOKEN if auth_required else None,
66 "supported_protocols": ["2024-11-05"]
67 }// Network-exposed MCP server; tool is callable by any authenticated or unauthenticated client.
11AUTH_TOKEN = os.getenv("MCP_AUTH_TOKEN", "mcp-example-token-12345")// Network-exposed MCP server; token is retrievable via get_server_info tool.
40app = FastMCP(server_name, auth=token_verifier) if token_verifier else FastMCP(server_name)// Network-exposed MCP server; no authentication enforced.
37func (h *MCPAuthHandler) GetClientToken(c *gin.Context) {
38 name := c.Param("name")
39
40 // Get adapter
41 adapter, err := h.store.Get(c.Request.Context(), name)
42 if err != nil || adapter == nil {
43 c.JSON(http.StatusNotFound, gin.H{"error": "Adapter not found"})
44 return
45 }
46
47 // Check if auth integration is available
48 if h.authIntegration == nil {
49 c.JSON(http.StatusServiceUnavailable, gin.H{"error": "Authentication integration not available"})
50 return
51 }
52
53 // Get client token
54 tokenResponse, err := h.authIntegration.GetClientToken(*adapter)
55 if err != nil {
56 c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
57 return
58 }
59
60 c.JSON(http.StatusOK, tokenResponse)
61}// Network-exposed proxy; endpoint is accessible without authentication.
29func (mais *MCPAuthIntegrationService) GetClientToken(adapter models.AdapterResource) (*ClientTokenResponse, error) {
30 log.Printf("MCPAuthIntegrationService: Getting client token for adapter %s", adapter.Name)
31
32 if adapter.Authentication == nil || !adapter.Authentication.Required {
33 return &ClientTokenResponse{
34 Token: "",
35 Type: "none",
36 ExpiresAt: time.Time{},
37 Message: "No authentication required",
38 }, nil
39 }
40
41 switch adapter.Authentication.Type {
42 case "bearer":
43 return mais.getBearerToken(adapter)
44 case "oauth":
45 return mais.getOAuthToken(adapter)
46 case "basic":
47 return mais.getBasicAuth(adapter)
48 case "apikey":
49 return mais.getAPIKey(adapter)
50 default:
51 return nil, fmt.Errorf("unsupported authentication type: %s", adapter.Authentication.Type)
52 }
53}// Network-exposed proxy; endpoint may be accessible without authentication.
242func (h *UnifiedMCPHandler) resolveAdapterURL(adapter models.AdapterResource) string {
243 targetURL := adapter.URL
244 if targetURL == "" {
245 return ""
246 }
247
248 if strings.Contains(targetURL, "/api/v1/adapters/") {
249 parts := strings.SplitN(targetURL, "/api/v1/adapters/", 2)
250 if len(parts) == 2 {
251 newURL := "http://127.0.0.1:8911/api/v1/adapters/" + parts[1]
252 logging.ProxyLogger.Info("UnifiedMCP: Internal loopback redirected: %s -> %s", targetURL, newURL)
253 return newURL
254 }
255 }
256 return targetURL
257}// Network-exposed proxy; adapter URLs may be user-controllable.
31func (s *MCPToolDiscoveryService) DiscoverTools(ctx context.Context, serverURL string, auth *models.AdapterAuthConfig) ([]models.MCPTool, error) {
32 log.Printf("MCPToolDiscovery: Discovering tools from server: %s", serverURL)
33
34 // Validate input parameters
35 if serverURL == "" {
36 return nil, fmt.Errorf("server URL cannot be empty")
37 }
38
39 // Create tools/list request
40 request := map[string]interface{}{
41 "jsonrpc": "2.0",
42 "id": 1,
43 "method": "tools/list",
44 "params": map[string]interface{}{},
45 }
46
47 requestBody, err := json.Marshal(request)
48 if err != nil {
49 return nil, fmt.Errorf("failed to marshal request: %w", err)
50 }
51
52 // Create HTTP request with timeout
53 req, err := http.NewRequestWithContext(ctx, "POST", serverURL, bytes.NewReader(requestBody))// Network-exposed proxy; serverURL comes from adapter configuration which may be user-controllable.
38os.environ['FASTMCP_CSRF_PROTECTION'] = 'false'// Network-exposed MCP server; relevant if accessed from web browsers.