Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions lldb/include/lldb/Protocol/MCP/MCPError.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class MCPError : public llvm::ErrorInfo<MCPError> {
public:
static char ID;

MCPError(std::string message, int64_t error_code = kInternalError);
MCPError(std::string message, int64_t error_code = eErrorCodeInternalError);

void log(llvm::raw_ostream &OS) const override;
std::error_code convertToErrorCode() const override;
Expand All @@ -28,9 +28,6 @@ class MCPError : public llvm::ErrorInfo<MCPError> {

lldb_protocol::mcp::Error toProtocolError() const;

static constexpr int64_t kResourceNotFound = -32002;
static constexpr int64_t kInternalError = -32603;

private:
std::string m_message;
int64_t m_error_code;
Expand Down
5 changes: 5 additions & 0 deletions lldb/include/lldb/Protocol/MCP/Protocol.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@ enum ErrorCode : signed {
eErrorCodeInvalidParams = -32602,
/// Internal JSON-RPC error.
eErrorCodeInternalError = -32603,

/// Additional MCP error codes.

/// Resource related uri not found.
eErrorCodeResourceNotFound = -32002,
};

struct Error {
Expand Down
31 changes: 4 additions & 27 deletions lldb/include/lldb/Protocol/MCP/Server.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,43 +9,20 @@
#ifndef LLDB_PROTOCOL_MCP_SERVER_H
#define LLDB_PROTOCOL_MCP_SERVER_H

#include "lldb/Host/JSONTransport.h"
#include "lldb/Host/MainLoop.h"
#include "lldb/Protocol/MCP/Protocol.h"
#include "lldb/Protocol/MCP/Resource.h"
#include "lldb/Protocol/MCP/Tool.h"
#include "lldb/Protocol/MCP/Transport.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/Support/Error.h"
#include <mutex>

namespace lldb_protocol::mcp {

class MCPTransport
: public lldb_private::JSONRPCTransport<Request, Response, Notification> {
public:
using LogCallback = std::function<void(llvm::StringRef message)>;

MCPTransport(lldb::IOObjectSP in, lldb::IOObjectSP out,
std::string client_name, LogCallback log_callback = {})
: JSONRPCTransport(in, out), m_client_name(std::move(client_name)),
m_log_callback(log_callback) {}
virtual ~MCPTransport() = default;

void Log(llvm::StringRef message) override {
if (m_log_callback)
m_log_callback(llvm::formatv("{0}: {1}", m_client_name, message).str());
}

private:
std::string m_client_name;
LogCallback m_log_callback;
};

class Server : public MCPTransport::MessageHandler {
class Server : public Transport::MessageHandler {
public:
Server(std::string name, std::string version,
std::unique_ptr<MCPTransport> transport_up,
lldb_private::MainLoop &loop);
std::unique_ptr<Transport> transport_up, lldb_private::MainLoop &loop);
~Server() = default;

using NotificationHandler = std::function<void(const Notification &)>;
Expand Down Expand Up @@ -92,7 +69,7 @@ class Server : public MCPTransport::MessageHandler {
const std::string m_name;
const std::string m_version;

std::unique_ptr<MCPTransport> m_transport_up;
std::unique_ptr<Transport> m_transport_up;
lldb_private::MainLoop &m_loop;

llvm::StringMap<std::unique_ptr<Tool>> m_tools;
Expand Down
39 changes: 39 additions & 0 deletions lldb/include/lldb/Protocol/MCP/Transport.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLDB_PROTOCOL_MCP_TRANSPORT_H
#define LLDB_PROTOCOL_MCP_TRANSPORT_H

#include "lldb/Host/JSONTransport.h"
#include "lldb/Protocol/MCP/Protocol.h"
#include "lldb/lldb-forward.h"
#include "llvm/ADT/StringRef.h"
#include <functional>
#include <string>

namespace lldb_protocol::mcp {

class Transport
: public lldb_private::JSONRPCTransport<Request, Response, Notification> {
public:
using LogCallback = std::function<void(llvm::StringRef message)>;

Transport(lldb::IOObjectSP in, lldb::IOObjectSP out, std::string client_name,
LogCallback log_callback = {});
virtual ~Transport() = default;

void Log(llvm::StringRef message) override;

private:
std::string m_client_name;
LogCallback m_log_callback;
};

} // namespace lldb_protocol::mcp

#endif
2 changes: 1 addition & 1 deletion lldb/source/Plugins/Protocol/MCP/ProtocolServerMCP.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ void ProtocolServerMCP::AcceptCallback(std::unique_ptr<Socket> socket) {
LLDB_LOG(log, "New MCP client connected: {0}", client_name);

lldb::IOObjectSP io_sp = std::move(socket);
auto transport_up = std::make_unique<lldb_protocol::mcp::MCPTransport>(
auto transport_up = std::make_unique<lldb_protocol::mcp::Transport>(
io_sp, io_sp, std::move(client_name), [&](llvm::StringRef message) {
LLDB_LOG(GetLog(LLDBLog::Host), "{0}", message);
});
Expand Down
1 change: 1 addition & 0 deletions lldb/source/Protocol/MCP/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ add_lldb_library(lldbProtocolMCP NO_PLUGIN_DEPENDENCIES
Protocol.cpp
Server.cpp
Tool.cpp
Transport.cpp

LINK_COMPONENTS
Support
Expand Down
6 changes: 3 additions & 3 deletions lldb/source/Protocol/MCP/Server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ using namespace lldb_protocol::mcp;
using namespace llvm;

Server::Server(std::string name, std::string version,
std::unique_ptr<MCPTransport> transport_up,
std::unique_ptr<Transport> transport_up,
lldb_private::MainLoop &loop)
: m_name(std::move(name)), m_version(std::move(version)),
m_transport_up(std::move(transport_up)), m_loop(loop) {
Expand Down Expand Up @@ -180,7 +180,7 @@ llvm::Expected<Response> Server::ResourcesReadHandler(const Request &request) {

return make_error<MCPError>(
llvm::formatv("no resource handler for uri: {0}", uri_str).str(),
MCPError::kResourceNotFound);
eErrorCodeResourceNotFound);
}

ServerCapabilities Server::GetCapabilities() {
Expand Down Expand Up @@ -219,7 +219,7 @@ void Server::Received(const Request &request) {
response.takeError(),
[&](const MCPError &err) { protocol_error = err.toProtocolError(); },
[&](const llvm::ErrorInfoBase &err) {
protocol_error.code = MCPError::kInternalError;
protocol_error.code = eErrorCodeInternalError;
protocol_error.message = err.message();
});
Response error_response;
Expand Down
32 changes: 32 additions & 0 deletions lldb/source/Protocol/MCP/Transport.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "lldb/Protocol/MCP/Transport.h"
#include "lldb/Host/JSONTransport.h"
#include "lldb/lldb-forward.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/FormatVariadic.h"
#include <string>
#include <utility>

using namespace llvm;
using namespace lldb;

namespace lldb_protocol::mcp {

Transport::Transport(IOObjectSP in, IOObjectSP out, std::string client_name,
LogCallback log_callback)
: JSONRPCTransport(in, out), m_client_name(std::move(client_name)),
m_log_callback(log_callback) {}

void Transport::Log(StringRef message) {
if (m_log_callback)
m_log_callback(formatv("{0}: {1}", m_client_name, message).str());
}

} // namespace lldb_protocol::mcp
7 changes: 4 additions & 3 deletions lldb/unittests/Protocol/ProtocolMCPServerTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "lldb/Protocol/MCP/Resource.h"
#include "lldb/Protocol/MCP/Server.h"
#include "lldb/Protocol/MCP/Tool.h"
#include "lldb/Protocol/MCP/Transport.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/JSON.h"
Expand All @@ -36,12 +37,12 @@ using namespace lldb_private;
using namespace lldb_protocol::mcp;

namespace {
class TestMCPTransport final : public MCPTransport {
class TestMCPTransport final : public lldb_protocol::mcp::Transport {
public:
TestMCPTransport(lldb::IOObjectSP in, lldb::IOObjectSP out)
: lldb_protocol::mcp::MCPTransport(in, out, "unittest") {}
: lldb_protocol::mcp::Transport(in, out, "unittest") {}

using MCPTransport::Write;
using Transport::Write;

void Log(llvm::StringRef message) override {
log_messages.emplace_back(message);
Expand Down
Loading