================ @@ -66,16 +87,62 @@ LLDBCommandTool::Call(const llvm::json::Value &args) { output += err_str; } - mcp::protocol::TextResult text_result; - text_result.content.emplace_back(mcp::protocol::TextContent{{output}}); - text_result.isError = !result.Succeeded(); - return text_result; + return createTextResult(output, !result.Succeeded()); } -std::optional<llvm::json::Value> LLDBCommandTool::GetSchema() const { +std::optional<llvm::json::Value> CommandTool::GetSchema() const { + llvm::json::Object id_type{{"type", "number"}}; llvm::json::Object str_type{{"type", "string"}}; - llvm::json::Object properties{{"arguments", std::move(str_type)}}; + llvm::json::Object properties{{"debugger_id", std::move(id_type)}, + {"arguments", std::move(str_type)}}; + llvm::json::Array required{"debugger_id"}; llvm::json::Object schema{{"type", "object"}, - {"properties", std::move(properties)}}; + {"properties", std::move(properties)}, + {"required", std::move(required)}}; return schema; } + +llvm::Expected<protocol::TextResult> +DebuggerListTool::Call(const protocol::ToolArguments &args) { + if (!std::holds_alternative<std::monostate>(args)) + return createStringError("DebuggerListTool takes no arguments"); + + llvm::json::Path::Root root; + + // Return a nested Markdown list with debuggers and target. + // Example output: + // + // - debugger 0 + // - target 0 /path/to/foo + // - target 1 + // - debugger 1 + // - target 0 /path/to/bar + // + // FIXME: Use Structured Content when we adopt protocol version 2025-06-18. + std::string output; + llvm::raw_string_ostream os(output); + + const size_t num_debuggers = Debugger::GetNumDebuggers(); + for (size_t i = 0; i < num_debuggers; ++i) { + lldb::DebuggerSP debugger_sp = Debugger::GetDebuggerAtIndex(i); + if (!debugger_sp) + continue; + + os << "- debugger " << i << '\n'; + + const TargetList &target_list = debugger_sp->GetTargetList(); + const size_t num_targets = target_list.GetNumTargets(); + for (size_t j = 0; j < num_targets; ++j) { + lldb::TargetSP target_sp = target_list.GetTargetAtIndex(j); + if (!target_sp) + continue; + os << " - target " << j; + // Append the module path if we have one. + if (Module *exe_module = target_sp->GetExecutableModulePointer()) + os << " " << exe_module->GetFileSpec().GetPath(); ---------------- ashgti wrote:
Should we also add a `* selected *` or something to indicate the debugger's main target if multiple exist? https://github.com/llvm/llvm-project/pull/145616 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits