cpp-mcp/include/mcp_protocol.h

203 lines
5.4 KiB
C++

/**
* @file mcp_protocol.h
* @brief Core definitions for the Model Context Protocol (MCP) framework
*
* This file contains the core structures, enums, and definitions for the MCP protocol.
* MCP connects AI models with data sources and tools in a standardized way.
*/
#ifndef MCP_PROTOCOL_H
#define MCP_PROTOCOL_H
#include <string>
#include <vector>
#include <map>
#include <functional>
#include <memory>
#include <stdexcept>
// Include the JSON library for parsing and generating JSON
#include "json.hpp"
namespace mcp {
// Use the nlohmann json library
using json = nlohmann::ordered_json;
// MCP version
constexpr const char* MCP_VERSION = "1.0.0";
// MCP error codes
enum class error_code {
none = 0,
invalid_request = 400,
unauthorized = 401,
forbidden = 403,
not_found = 404,
method_not_allowed = 405,
conflict = 409,
payload_too_large = 413,
unsupported_media_type = 415,
internal_server_error = 500,
service_unavailable = 503
};
// MCP exception class
class mcp_exception : public std::runtime_error {
public:
mcp_exception(error_code code, const std::string& message)
: std::runtime_error(message), code_(code) {}
error_code code() const { return code_; }
private:
error_code code_;
};
// Resource Types
enum class resource_type {
file, // File resource
directory, // Directory/folder resource
database, // Database resource
api, // API endpoints
document, // Document resource
image, // Image resource
custom // Custom resource type
};
// Content Types
struct content_type {
static constexpr const char* json = "application/json";
static constexpr const char* text = "text/plain";
static constexpr const char* octet_stream = "application/octet-stream";
static constexpr const char* form = "application/x-www-form-urlencoded";
static constexpr const char* multipart = "multipart/form-data";
static constexpr const char* image_jpeg = "image/jpeg";
static constexpr const char* image_png = "image/png";
};
// HTTP Methods
enum class http_method {
get,
post,
put,
delete_,
patch,
options,
head
};
// Convert HTTP method to string
inline std::string http_method_to_string(http_method method) {
switch (method) {
case http_method::get: return "GET";
case http_method::post: return "POST";
case http_method::put: return "PUT";
case http_method::delete_: return "DELETE";
case http_method::patch: return "PATCH";
case http_method::options: return "OPTIONS";
case http_method::head: return "HEAD";
default: return "UNKNOWN";
}
}
// Convert string to HTTP method
inline http_method string_to_http_method(const std::string& method_str) {
if (method_str == "GET") return http_method::get;
if (method_str == "POST") return http_method::post;
if (method_str == "PUT") return http_method::put;
if (method_str == "DELETE") return http_method::delete_;
if (method_str == "PATCH") return http_method::patch;
if (method_str == "OPTIONS") return http_method::options;
if (method_str == "HEAD") return http_method::head;
throw mcp_exception(error_code::method_not_allowed, "Unsupported HTTP method: " + method_str);
}
// MCP Request structure
struct request {
http_method method;
std::string path;
std::map<std::string, std::string> headers;
std::map<std::string, std::string> query_params;
std::string body;
// Parse JSON body
json json_body() const {
if (body.empty()) {
return json::object();
}
try {
return json::parse(body);
} catch (const json::exception& e) {
throw mcp_exception(error_code::invalid_request, "Invalid JSON in request body: " + std::string(e.what()));
}
}
};
// MCP Response structure
struct response {
int status_code = 200;
std::map<std::string, std::string> headers;
std::string body;
// Set JSON body
void set_json_body(const json& data) {
body = data.dump();
headers["Content-Type"] = content_type::json;
}
// Set error response
void set_error(error_code code, const std::string& message) {
status_code = static_cast<int>(code);
json error = {
{"error", {
{"code", status_code},
{"message", message}
}}
};
set_json_body(error);
}
};
// Base class for MCP resources
class resource {
public:
virtual ~resource() = default;
// Get resource type
virtual resource_type type() const = 0;
// Get resource metadata
virtual json metadata() const = 0;
// Handle request
virtual response handle_request(const request& req) = 0;
// Get resource schema
virtual json schema() const {
return json::object(); // Default empty schema
}
};
// MCP Tool definition
struct tool {
std::string name;
std::string description;
json parameters_schema;
// Convert to JSON for API documentation
json to_json() const {
return {
{"name", name},
{"description", description},
{"parameters", parameters_schema}
};
}
};
// Tool handler function type
using tool_handler = std::function<json(const json&)>;
} // namespace mcp
#endif // MCP_PROTOCOL_H