#pragma once #include #include #include #include namespace hex::mcp { class JsonRpc { public: explicit JsonRpc(std::string request) : m_request(std::move(request)){ } struct MethodNotFoundException : std::exception {}; struct InvalidParametersException : std::exception {}; enum class ErrorCode: i16 { ParseError = -32700, InvalidRequest = -32600, MethodNotFound = -32601, InvalidParams = -32602, InternalError = -32603, }; using Callback = std::function; std::optional execute(const Callback &callback); void setError(ErrorCode code, std::string message); private: std::optional handleMessage(const nlohmann::json &request, const Callback &callback); std::optional handleBatchedMessages(const nlohmann::json &request, const Callback &callback); nlohmann::json createDefaultMessage(); nlohmann::json createErrorMessage(ErrorCode code, const std::string &message); nlohmann::json createResponseMessage(const nlohmann::json &result); private: std::string m_request; std::optional m_id; struct Error { ErrorCode code; std::string message; }; std::optional m_error; }; struct TextContent { std::string text; operator nlohmann::json() const { nlohmann::json result; result["content"] = nlohmann::json::array({ nlohmann::json::object({ { "type", "text" }, { "text", text } }) }); return result; } }; struct StructuredContent { std::string text; nlohmann::json data; operator nlohmann::json() const { nlohmann::json result; result["content"] = nlohmann::json::array({ nlohmann::json::object({ { "type", "text" }, { "text", text } }) }); result["structuredContent"] = data; return result; } }; class Server { public: constexpr static auto McpInternalPort = 19743; Server(); ~Server(); void listen(); void shutdown(); void disconnect(); bool isConnected(); void addPrimitive(std::string type, std::string_view capabilities, std::function function); private: nlohmann::json handleInitialize(); void handleNotifications(const std::string &method, const nlohmann::json ¶ms); struct Primitive { nlohmann::json capabilities; std::function function; }; std::map> m_primitives; wolv::net::SocketServer m_server; bool m_connected = false; }; }