20constexpr CommandEntry kCommandTable[] = {
22 {
"get_server_info",
"server"},
23 {
"list_commands",
"introspection"},
24 {
"describe_command",
"introspection"},
26 {
"load_circuit",
"file"},
27 {
"save_circuit",
"file"},
28 {
"new_circuit",
"file"},
29 {
"close_circuit",
"file"},
30 {
"get_tab_count",
"file"},
31 {
"export_image",
"file"},
32 {
"export_arduino",
"file"},
33 {
"export_systemverilog",
"file"},
35 {
"create_element",
"element"},
36 {
"delete_element",
"element"},
37 {
"list_elements",
"element"},
38 {
"move_element",
"element"},
39 {
"set_element_properties",
"element"},
40 {
"set_input_value",
"element"},
41 {
"get_output_value",
"element"},
42 {
"rotate_element",
"element"},
43 {
"flip_element",
"element"},
44 {
"update_element",
"element"},
45 {
"change_input_size",
"element"},
46 {
"change_output_size",
"element"},
47 {
"toggle_truth_table_output",
"element"},
48 {
"morph_element",
"element"},
50 {
"connect_elements",
"connection"},
51 {
"disconnect_elements",
"connection"},
52 {
"list_connections",
"connection"},
53 {
"split_connection",
"connection"},
55 {
"simulation_control",
"simulation"},
56 {
"create_waveform",
"simulation"},
57 {
"export_waveform",
"simulation"},
60 {
"instantiate_ic",
"ic"},
67 {
"get_undo_stack",
"history"},
69 {
"get_theme",
"theme"},
70 {
"set_theme",
"theme"},
71 {
"get_effective_theme",
"theme"},
74QString categoryFor(
const QString &commandName)
76 for (
const auto &entry : kCommandTable) {
77 if (commandName == QLatin1String(entry.name)) {
78 return QString::fromLatin1(entry.category);
92 if (command ==
"get_server_info") {
93 return handleGetServerInfo(params, requestId);
94 }
else if (command ==
"list_commands") {
95 return handleListCommands(params, requestId);
96 }
else if (command ==
"describe_command") {
97 return handleDescribeCommand(params, requestId);
104QJsonObject ServerInfoHandler::handleGetServerInfo(
const QJsonObject &,
const QJsonValue &requestId)
107 result[
"server_name"] =
"wiRedPanda MCP Server";
108 result[
"version"] = APP_VERSION;
109 result[
"protocol_version"] =
"1.0";
110 result[
"status"] =
"ready";
112 QJsonArray capabilities;
113 capabilities.append(
"circuit_design");
114 capabilities.append(
"simulation");
115 capabilities.append(
"file_operations");
116 capabilities.append(
"image_export");
117 capabilities.append(
"waveform_generation");
118 capabilities.append(
"ic_management");
119 result[
"capabilities"] = capabilities;
124QJsonObject ServerInfoHandler::handleListCommands(
const QJsonObject &,
const QJsonValue &requestId)
127 QSet<QString> categorySet;
129 for (
const auto &entry : kCommandTable) {
131 cmd[
"name"] = QString::fromLatin1(entry.name);
132 cmd[
"category"] = QString::fromLatin1(entry.category);
133 commands.append(cmd);
134 categorySet.insert(QString::fromLatin1(entry.category));
137 QStringList sortedCategories(categorySet.begin(), categorySet.end());
138 sortedCategories.sort();
140 QJsonArray categories;
141 for (
const QString &c : sortedCategories) {
142 categories.append(c);
146 result[
"commands"] = commands;
147 result[
"categories"] = categories;
151QJsonObject ServerInfoHandler::handleDescribeCommand(
const QJsonObject ¶ms,
const QJsonValue &requestId)
162 const QString name = params.value(
"name").toString();
163 const QString category = categoryFor(name);
165 if (category.isEmpty()) {
177 const json responseSchema =
m_validator->findResponseSchema(name +
"_response");
180 result[
"name"] = name;
181 result[
"category"] = category;
const MCPValidator * m_validator
QJsonObject createSuccessResponse(const QJsonObject &result={}, const QJsonValue &requestId=QJsonValue()) const
BaseHandler(MainWindow *mainWindow, const MCPValidator *validator)
QJsonObject createErrorResponse(const QString &error, const QJsonValue &requestId=QJsonValue(), int code=JsonRpcError::InternalError) const
bool validateParameters(const QJsonObject ¶ms, const QStringList &required) const
bool validateNonEmptyString(const QJsonValue &value, const QString ¶mName, QString &errorMsg) const
JSON Schema validator for MCP commands and responses using native json-schema-validator.
static QJsonObject nlohmannToQJson(const json &nlohmannJson)
The top-level application window hosting the tab bar, menus, element palette, and editor.
QJsonObject handleCommand(const QString &command, const QJsonObject ¶ms, const QJsonValue &requestId) override
ServerInfoHandler(MainWindow *mainWindow, const MCPValidator *validator)
constexpr int MethodNotFound
The requested method does not exist or is unavailable.
constexpr int InternalError
Internal JSON-RPC error (last-resort).
constexpr int InvalidParams
Invalid method parameters (missing required, wrong type, etc.).