using System; using System.Collections.Generic; using System.Linq; using UnityEditor; using UnityEngine; namespace MCPForUnity.Editor.Clients { /// /// Central registry that auto-discovers configurators via TypeCache. /// public static class McpClientRegistry { private static List cached; public static IReadOnlyList All { get { if (cached == null) { cached = BuildRegistry(); } return cached; } } private static List BuildRegistry() { var configurators = new List(); foreach (var type in TypeCache.GetTypesDerivedFrom()) { if (type.IsAbstract || !type.IsClass || !type.IsPublic) continue; // Require a public parameterless constructor if (type.GetConstructor(Type.EmptyTypes) == null) continue; try { if (Activator.CreateInstance(type) is IMcpClientConfigurator instance) { configurators.Add(instance); } } catch (Exception ex) { Debug.LogWarning($"UnityMCP: Failed to instantiate configurator {type.Name}: {ex.Message}"); } } // Alphabetical order by display name configurators = configurators.OrderBy(c => c.DisplayName, StringComparer.OrdinalIgnoreCase).ToList(); return configurators; } } }