From a3ad314cd40d13e8a8bd1d9049550ba803aa9d45 Mon Sep 17 00:00:00 2001 From: Petr Mironychev <9195189+Palm1r@users.noreply.github.com> Date: Sun, 17 May 2026 21:40:48 +0200 Subject: [PATCH] feat: Add qt-docs mcp server --- mcp/McpClientsManager.cpp | 43 ++++++++++++++++++++++++------- mcp/McpClientsManager.hpp | 1 + settings/McpClientsListAspect.cpp | 8 ++++++ 3 files changed, 42 insertions(+), 10 deletions(-) diff --git a/mcp/McpClientsManager.cpp b/mcp/McpClientsManager.cpp index 6a01a38..80a016d 100644 --- a/mcp/McpClientsManager.cpp +++ b/mcp/McpClientsManager.cpp @@ -189,19 +189,42 @@ QList McpClientsManager::toolsCapableProviders() cons return out; } +QJsonObject McpClientsManager::builtinServers() +{ + static const QByteArray pseudoConfig( + "{\n" + " \"mcpServers\": {\n" + " \"qt-docs\": {\n" + " \"type\": \"sse\",\n" + " \"url\": \"https://qt-docs-mcp.qt.io/mcp\",\n" + " \"enable\": false\n" + " }\n" + " }\n" + "}\n"); + const QJsonDocument doc = QJsonDocument::fromJson(pseudoConfig); + return doc.object().value(QLatin1String(kServersKey)).toObject(); +} + QJsonObject McpClientsManager::readRoot() const { + QJsonObject root{{QLatin1String(kServersKey), QJsonObject{}}}; + QFile f(configFilePath()); - if (!f.open(QIODevice::ReadOnly | QIODevice::Text)) - return QJsonObject{{QLatin1String(kServersKey), QJsonObject{}}}; - QJsonParseError err; - const QJsonDocument doc = QJsonDocument::fromJson(f.readAll(), &err); - f.close(); - if (err.error != QJsonParseError::NoError || !doc.isObject()) - return QJsonObject{{QLatin1String(kServersKey), QJsonObject{}}}; - QJsonObject root = doc.object(); - if (!root.contains(QLatin1String(kServersKey))) - root.insert(QLatin1String(kServersKey), QJsonObject{}); + if (f.open(QIODevice::ReadOnly | QIODevice::Text)) { + QJsonParseError err; + const QJsonDocument doc = QJsonDocument::fromJson(f.readAll(), &err); + f.close(); + if (err.error == QJsonParseError::NoError && doc.isObject()) + root = doc.object(); + } + + QJsonObject servers = root.value(QLatin1String(kServersKey)).toObject(); + const QJsonObject builtin = builtinServers(); + for (auto it = builtin.begin(); it != builtin.end(); ++it) { + if (!servers.contains(it.key())) + servers.insert(it.key(), it.value()); + } + root.insert(QLatin1String(kServersKey), servers); return root; } diff --git a/mcp/McpClientsManager.hpp b/mcp/McpClientsManager.hpp index dfaf28c..8e8437a 100644 --- a/mcp/McpClientsManager.hpp +++ b/mcp/McpClientsManager.hpp @@ -50,6 +50,7 @@ private: void updateWatchedPaths(); QList toolsCapableProviders() const; + static QJsonObject builtinServers(); QJsonObject readRoot() const; bool writeRoot(const QJsonObject &root); diff --git a/settings/McpClientsListAspect.cpp b/settings/McpClientsListAspect.cpp index 8eae67f..4fba8bc 100644 --- a/settings/McpClientsListAspect.cpp +++ b/settings/McpClientsListAspect.cpp @@ -181,6 +181,14 @@ QList buildExamplePresets() {"url", "http://127.0.0.1:3001/sse"}, {"spec", "2024-11-05"}}}); + out.append( + {McpClientsListAspect::tr("qt-docs (Qt documentation)"), + QStringLiteral("qt-docs"), + QJsonObject{ + {"enable", true}, + {"type", "sse"}, + {"url", "https://qt-docs-mcp.qt.io/mcp"}}}); + out.append( {McpClientsListAspect::tr("remote (SSE / HTTP)"), QStringLiteral("remote"),