// Copyright (C) 2024-2026 Petr Mironychev // SPDX-License-Identifier: GPL-3.0-or-later #pragma once #include #include #include #include #include #include "McpServerConnection.hpp" class QFileSystemWatcher; class QTimer; namespace QodeAssist::Mcp { class McpClientsManager : public QObject { Q_OBJECT public: static McpClientsManager &instance(); static QString configFilePath(); static QByteArray emptyConfigTemplate(); void init(); QList connections() const; bool setServerEnabled(const QString &name, bool enabled); bool addServer(const QString &name, const QJsonObject &entry); bool removeServer(const QString &name); void reload(); signals: void serversChanged(); void writeFailed(const QString &reason); private: explicit McpClientsManager(QObject *parent = nullptr); ~McpClientsManager() override; McpClientsManager(const McpClientsManager &) = delete; McpClientsManager &operator=(const McpClientsManager &) = delete; void loadFromDisk(); void ensureFileExists(); void setupWatcher(); void updateWatchedPaths(); QList toolsCapableProviders() const; QJsonObject readRoot() const; bool writeRoot(const QJsonObject &root); bool m_initialized = false; bool m_suppressNextWatcherReload = false; QList m_connections; QPointer m_watcher; QPointer m_reloadDebounce; }; } // namespace QodeAssist::Mcp