[Lldb-commits] [lldb] [lldb][mcp] Get the running MCP server connection information (PR #162752)

Alexandre Perez via lldb-commits lldb-commits at lists.llvm.org
Thu Oct 9 16:33:41 PDT 2025


https://github.com/aperez created https://github.com/llvm/llvm-project/pull/162752

Currently AFAICT we don't have a way to get the MCP server socket after it started. So this change introduces a new `protocol-server` subcommand that allows us to query the location of a running server:

```
(lldb) protocol-server start MCP listen://localhost:0
MCP server started with connection listeners: connection://[::1]:36051, connection://[127.0.0.1]:36051
(lldb) protocol-server get MCP
MCP server connection listeners: connection://[::1]:36051, connection://[127.0.0.1]:36051
(lldb) protocol-server stop MCP
(lldb) protocol-server get MCP
error: MCP server is not running
```

>From cf719895cfd59ce55d349d8f27ae60ad13a3f96d Mon Sep 17 00:00:00 2001
From: Alexandre Perez <alexandreperez at meta.com>
Date: Thu, 9 Oct 2025 16:23:46 -0700
Subject: [PATCH] [lldb][mcp] Add protocol-server subcommand to get the running
 MCP server connection information

---
 .../Commands/CommandObjectProtocolServer.cpp  | 45 ++++++++++++++++++-
 .../Protocol/MCP/ProtocolServerMCP.cpp        |  1 +
 .../commands/protocol/TestMCPUnixSocket.py    | 13 ++++++
 3 files changed, 58 insertions(+), 1 deletion(-)

diff --git a/lldb/source/Commands/CommandObjectProtocolServer.cpp b/lldb/source/Commands/CommandObjectProtocolServer.cpp
index c5ab9e9f05bec..ff9d38c84ed2d 100644
--- a/lldb/source/Commands/CommandObjectProtocolServer.cpp
+++ b/lldb/source/Commands/CommandObjectProtocolServer.cpp
@@ -131,15 +131,58 @@ class CommandObjectProtocolServerStop : public CommandObjectParsed {
   }
 };
 
+class CommandObjectProtocolServerGet : public CommandObjectParsed {
+public:
+  CommandObjectProtocolServerGet(CommandInterpreter &interpreter)
+      : CommandObjectParsed(interpreter, "protocol-server get",
+                            "get protocol server connection information",
+                            "protocol-server get <protocol>") {
+    AddSimpleArgumentList(lldb::eArgTypeProtocol, eArgRepeatPlain);
+  }
+
+  ~CommandObjectProtocolServerGet() override = default;
+
+protected:
+  void DoExecute(Args &args, CommandReturnObject &result) override {
+    if (args.GetArgumentCount() < 1) {
+      result.AppendError("no protocol specified");
+      return;
+    }
+
+    llvm::StringRef protocol = args.GetArgumentAtIndex(0);
+    ProtocolServer *server = ProtocolServer::GetOrCreate(protocol);
+    if (!server) {
+      result.AppendErrorWithFormatv(
+          "unsupported protocol: {0}. Supported protocols are: {1}", protocol,
+          llvm::join(ProtocolServer::GetSupportedProtocols(), ", "));
+      return;
+    }
+
+    Socket *socket = server->GetSocket();
+    if (!socket) {
+      result.AppendErrorWithFormatv("{0} server is not running", protocol);
+      return;
+    }
+
+    std::string address =
+        llvm::join(socket->GetListeningConnectionURI(), ", ");
+    result.AppendMessageWithFormatv(
+        "{0} server connection listeners: {1}", protocol, address);
+    result.SetStatus(eReturnStatusSuccessFinishNoResult);
+  }
+};
+
 CommandObjectProtocolServer::CommandObjectProtocolServer(
     CommandInterpreter &interpreter)
     : CommandObjectMultiword(interpreter, "protocol-server",
-                             "Start and stop a protocol server.",
+                             "Start, stop, and query protocol servers.",
                              "protocol-server") {
   LoadSubCommand("start", CommandObjectSP(new CommandObjectProtocolServerStart(
                               interpreter)));
   LoadSubCommand("stop", CommandObjectSP(
                              new CommandObjectProtocolServerStop(interpreter)));
+  LoadSubCommand("get", CommandObjectSP(
+                            new CommandObjectProtocolServerGet(interpreter)));
 }
 
 CommandObjectProtocolServer::~CommandObjectProtocolServer() = default;
diff --git a/lldb/source/Plugins/Protocol/MCP/ProtocolServerMCP.cpp b/lldb/source/Plugins/Protocol/MCP/ProtocolServerMCP.cpp
index 33bdd5eec3644..390cf3eeb16a5 100644
--- a/lldb/source/Plugins/Protocol/MCP/ProtocolServerMCP.cpp
+++ b/lldb/source/Plugins/Protocol/MCP/ProtocolServerMCP.cpp
@@ -144,6 +144,7 @@ llvm::Error ProtocolServerMCP::Stop() {
 
   m_server.reset(nullptr);
   m_server_info_handle.Remove();
+  m_listener.reset();
 
   return llvm::Error::success();
 }
diff --git a/lldb/test/API/commands/protocol/TestMCPUnixSocket.py b/lldb/test/API/commands/protocol/TestMCPUnixSocket.py
index ea9255cc60ef5..9edb97eb791b9 100644
--- a/lldb/test/API/commands/protocol/TestMCPUnixSocket.py
+++ b/lldb/test/API/commands/protocol/TestMCPUnixSocket.py
@@ -32,3 +32,16 @@ def test_unix_socket(self):
             startstr="MCP server started with connection listeners:",
             substrs=[f"unix-connect://{socket_file}"],
         )
+
+        self.expect(
+            "protocol-server get MCP",
+            startstr="MCP server connection listeners:",
+            substrs=[f"unix-connect://{socket_file}"],
+        )
+
+        self.runCmd("protocol-server stop MCP", check=False)
+        self.expect(
+            "protocol-server get MCP",
+            error=True,
+            substrs=["MCP server is not running"],
+        )



More information about the lldb-commits mailing list