/** * @file mcp_server.h * @brief MCP Server implementation * * This file implements the server-side functionality for the Model Context Protocol. * Follows the 2024-11-05 basic protocol specification. */ #ifndef MCP_SERVER_H #define MCP_SERVER_H #include "mcp_message.h" #include "mcp_resource.h" #include "mcp_tool.h" // Include the HTTP library #include "httplib.h" #include #include #include #include #include #include #include namespace mcp { /** * @class server * @brief Main MCP server class * * The server class implements an HTTP server that handles JSON-RPC requests * according to the Model Context Protocol specification. */ class server { public: /** * @brief Constructor * @param host The host to bind to (e.g., "localhost", "0.0.0.0") * @param port The port to listen on */ server(const std::string& host = "localhost", int port = 8080); /** * @brief Destructor */ ~server(); /** * @brief Start the server * @param blocking If true, this call blocks until the server stops * @return True if the server started successfully */ bool start(bool blocking = true); /** * @brief Stop the server */ void stop(); /** * @brief Check if the server is running * @return True if the server is running */ bool is_running() const; /** * @brief Set server information * @param name The name of the server * @param version The version of the server */ void set_server_info(const std::string& name, const std::string& version); /** * @brief Set server capabilities * @param capabilities The capabilities of the server */ void set_capabilities(const json& capabilities); /** * @brief Register a method handler * @param method The method name * @param handler The function to call when the method is invoked */ void register_method(const std::string& method, std::function handler); /** * @brief Register a notification handler * @param method The notification method name * @param handler The function to call when the notification is received */ void register_notification(const std::string& method, std::function handler); /** * @brief Register a resource * @param path The path to mount the resource at * @param resource The resource to register */ void register_resource(const std::string& path, std::shared_ptr resource); /** * @brief Register a tool * @param tool The tool to register * @param handler The function to call when the tool is invoked */ void register_tool(const tool& tool, tool_handler handler); /** * @brief Get the list of available tools * @return JSON array of available tools */ std::vector get_tools() const; /** * @brief Set authentication handler * @param handler Function that takes a token and returns true if valid */ void set_auth_handler(std::function handler); /** * @brief Send a request to a client * @param client_address The address of the client * @param method The method to call * @param params The parameters to pass * * This method will only send requests other than ping and logging * after the client has sent the initialized notification. */ void send_request(const std::string& client_address, const std::string& method, const json& params = json::object()); private: std::string host_; int port_; std::string name_; std::string version_; json capabilities_; // The HTTP server std::unique_ptr http_server_; // Server thread (for non-blocking mode) std::unique_ptr server_thread_; // Method handlers std::map> method_handlers_; // Notification handlers std::map> notification_handlers_; // Resources map (path -> resource) std::map> resources_; // Tools map (name -> handler) std::map> tools_; // Authentication handler std::function auth_handler_; // Mutex for thread safety mutable std::mutex mutex_; // Running flag bool running_ = false; // Map to track client initialization status (client_address -> initialized) std::map client_initialized_; // Handle incoming JSON-RPC requests void handle_jsonrpc(const httplib::Request& req, httplib::Response& res); // Process a JSON-RPC request json process_request(const request& req, const std::string& client_address); // Handle initialization request json handle_initialize(const request& req, const std::string& client_address); // Check if a client is initialized bool is_client_initialized(const std::string& client_address) const; // Set client initialization status void set_client_initialized(const std::string& client_address, bool initialized); }; } // namespace mcp #endif // MCP_SERVER_H