mirror of https://github.com/sysown/proxysql
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
209 lines
5.6 KiB
209 lines
5.6 KiB
#ifndef CLASS_MCP_ENDPOINT_H
|
|
#define CLASS_MCP_ENDPOINT_H
|
|
|
|
#ifdef PROXYSQLGENAI
|
|
|
|
#include "proxysql.h"
|
|
#include <string>
|
|
#include <memory>
|
|
|
|
// Forward declarations
|
|
class MCP_Threads_Handler;
|
|
class MCP_Tool_Handler;
|
|
|
|
// Include httpserver after proxysql.h
|
|
#include "httpserver.hpp"
|
|
|
|
// Include JSON library
|
|
#include "../deps/json/json.hpp"
|
|
using json = nlohmann::json;
|
|
#define PROXYJSON
|
|
|
|
/**
|
|
* @brief MCP JSON-RPC 2.0 Resource class
|
|
*
|
|
* This class extends httpserver::http_resource to provide JSON-RPC 2.0
|
|
* endpoints for MCP protocol communication. Each endpoint handles
|
|
* POST requests with JSON-RPC 2.0 formatted payloads.
|
|
*
|
|
* Each endpoint has its own dedicated tool handler that provides
|
|
* endpoint-specific tools.
|
|
*/
|
|
class MCP_JSONRPC_Resource : public httpserver::http_resource {
|
|
private:
|
|
MCP_Threads_Handler* handler; ///< Pointer to MCP handler for variable access
|
|
MCP_Tool_Handler* tool_handler; ///< Pointer to endpoint's dedicated tool handler
|
|
std::string endpoint_name; ///< Endpoint name (config, query, admin, etc.)
|
|
|
|
/**
|
|
* @brief Authenticate the incoming request
|
|
*
|
|
* Placeholder for future authentication implementation.
|
|
* Currently always returns true.
|
|
*
|
|
* @param req The HTTP request
|
|
* @return true if authenticated, false otherwise
|
|
*/
|
|
bool authenticate_request(const httpserver::http_request& req);
|
|
|
|
/**
|
|
* @brief Handle JSON-RPC 2.0 request
|
|
*
|
|
* Processes the JSON-RPC request and returns an appropriate response.
|
|
*
|
|
* @param req The HTTP request
|
|
* @return HTTP response with JSON-RPC response
|
|
*/
|
|
std::shared_ptr<httpserver::http_response> handle_jsonrpc_request(
|
|
const httpserver::http_request& req
|
|
);
|
|
|
|
/**
|
|
* @brief Create a JSON-RPC 2.0 success response
|
|
*
|
|
* @param result The result data to include
|
|
* @param id The request ID (can be string, number, or null)
|
|
* @return JSON string representing the response
|
|
*/
|
|
std::string create_jsonrpc_response(
|
|
const std::string& result,
|
|
const json& id = nullptr
|
|
);
|
|
|
|
/**
|
|
* @brief Create a JSON-RPC 2.0 error response
|
|
*
|
|
* @param code The error code (JSON-RPC standard or custom)
|
|
* @param message The error message
|
|
* @param id The request ID (can be string, number, or null)
|
|
* @return JSON string representing the error response
|
|
*/
|
|
std::string create_jsonrpc_error(
|
|
int code,
|
|
const std::string& message,
|
|
const json& id = nullptr
|
|
);
|
|
|
|
/**
|
|
* @brief Handle tools/list method
|
|
*
|
|
* Returns a list of available MySQL exploration tools.
|
|
*
|
|
* @return JSON with tools array
|
|
*/
|
|
json handle_tools_list();
|
|
|
|
/**
|
|
* @brief Handle tools/describe method
|
|
*
|
|
* Returns detailed information about a specific tool.
|
|
*
|
|
* @param req_json The JSON-RPC request
|
|
* @return JSON with tool description
|
|
*/
|
|
json handle_tools_describe(const json& req_json);
|
|
|
|
/**
|
|
* @brief Handle tools/call method
|
|
*
|
|
* Executes a tool with the provided arguments.
|
|
*
|
|
* @param req_json The JSON-RPC request
|
|
* @return JSON with tool execution result
|
|
*/
|
|
json handle_tools_call(const json& req_json);
|
|
|
|
/**
|
|
* @brief Handle prompts/list method
|
|
*
|
|
* Returns an empty prompts array since ProxySQL doesn't support prompts.
|
|
*
|
|
* @return JSON with empty prompts array
|
|
*/
|
|
json handle_prompts_list();
|
|
|
|
/**
|
|
* @brief Handle resources/list method
|
|
*
|
|
* Returns an empty resources array since ProxySQL doesn't support resources.
|
|
*
|
|
* @return JSON with empty resources array
|
|
*/
|
|
json handle_resources_list();
|
|
|
|
public:
|
|
/**
|
|
* @brief Constructor for MCP_JSONRPC_Resource
|
|
*
|
|
* @param h Pointer to the MCP_Threads_Handler instance
|
|
* @param th Pointer to the endpoint's dedicated tool handler
|
|
* @param name The name of this endpoint (e.g., "config", "query")
|
|
*/
|
|
MCP_JSONRPC_Resource(MCP_Threads_Handler* h, MCP_Tool_Handler* th, const std::string& name);
|
|
|
|
/**
|
|
* @brief Destructor
|
|
*/
|
|
~MCP_JSONRPC_Resource();
|
|
|
|
/**
|
|
* @brief Handle GET requests
|
|
*
|
|
* Returns HTTP 405 Method Not Allowed for GET requests.
|
|
*
|
|
* According to the MCP specification 2025-06-18 (Streamable HTTP transport):
|
|
* "The server MUST either return Content-Type: text/event-stream in response to
|
|
* this HTTP GET, or else return HTTP 405 Method Not Allowed, indicating that
|
|
* the server does not offer an SSE stream at this endpoint."
|
|
*
|
|
* @param req The HTTP request
|
|
* @return HTTP 405 response with Allow: POST header
|
|
*/
|
|
const std::shared_ptr<httpserver::http_response> render_GET(
|
|
const httpserver::http_request& req
|
|
) override;
|
|
|
|
/**
|
|
* @brief Handle OPTIONS requests (CORS preflight)
|
|
*
|
|
* Returns CORS headers for OPTIONS preflight requests.
|
|
*
|
|
* @param req The HTTP request
|
|
* @return HTTP response with CORS headers
|
|
*/
|
|
const std::shared_ptr<httpserver::http_response> render_OPTIONS(
|
|
const httpserver::http_request& req
|
|
) override;
|
|
|
|
/**
|
|
* @brief Handle DELETE requests
|
|
*
|
|
* Returns HTTP 405 Method Not Allowed for DELETE requests.
|
|
*
|
|
* According to the MCP specification 2025-06-18 (Streamable HTTP transport):
|
|
* "The server MAY respond to this request with HTTP 405 Method Not Allowed,
|
|
* indicating that the server does not allow clients to terminate sessions."
|
|
*
|
|
* @param req The HTTP request
|
|
* @return HTTP 405 response with Allow header
|
|
*/
|
|
const std::shared_ptr<httpserver::http_response> render_DELETE(
|
|
const httpserver::http_request& req
|
|
) override;
|
|
|
|
/**
|
|
* @brief Handle POST requests
|
|
*
|
|
* Processes incoming JSON-RPC 2.0 POST requests.
|
|
*
|
|
* @param req The HTTP request
|
|
* @return HTTP response with JSON-RPC response
|
|
*/
|
|
const std::shared_ptr<httpserver::http_response> render_POST(
|
|
const httpserver::http_request& req
|
|
) override;
|
|
};
|
|
|
|
#endif /* PROXYSQLGENAI */
|
|
#endif /* CLASS_MCP_ENDPOINT_H */
|