cxxmcp 1.1.6
C++ MCP SDK
Loading...
Searching...
No Matches
logging.hpp
Go to the documentation of this file.
1// Copyright (c) 2025 [caomengxuan666]
2
3#pragma once
4
11
12#include <optional>
13#include <string>
14#include <utility>
15
18
19namespace mcp::protocol {
20
22enum class LoggingLevel {
24 Debug,
26 Info,
28 Notice,
30 Warning,
32 Error,
36 Alert,
39};
40
44 LoggingLevel level = LoggingLevel::Info;
46 std::optional<Json> meta;
48 Json extensions = Json::object();
49};
50
54 LoggingLevel level = LoggingLevel::Info;
56 std::optional<std::string> logger;
60 std::optional<Json> meta;
62 Json extensions = Json::object();
63};
64
66inline core::Error logging_json_error(std::string message) {
67 return core::Error{
68 static_cast<int>(ErrorCode::InvalidRequest), std::move(message), {}};
69}
70
72inline std::string logging_level_to_string(LoggingLevel level) {
73 switch (level) {
74 case LoggingLevel::Debug:
75 return "debug";
76 case LoggingLevel::Info:
77 return "info";
78 case LoggingLevel::Notice:
79 return "notice";
80 case LoggingLevel::Warning:
81 return "warning";
82 case LoggingLevel::Error:
83 return "error";
84 case LoggingLevel::Critical:
85 return "critical";
86 case LoggingLevel::Alert:
87 return "alert";
88 case LoggingLevel::Emergency:
89 return "emergency";
90 }
91 return "info";
92}
93
96inline std::optional<LoggingLevel> logging_level_from_string(
97 const std::string& value) {
98 if (value == "debug") {
99 return LoggingLevel::Debug;
100 }
101 if (value == "info") {
102 return LoggingLevel::Info;
103 }
104 if (value == "notice") {
105 return LoggingLevel::Notice;
106 }
107 if (value == "warning") {
108 return LoggingLevel::Warning;
109 }
110 if (value == "error") {
111 return LoggingLevel::Error;
112 }
113 if (value == "critical") {
114 return LoggingLevel::Critical;
115 }
116 if (value == "alert") {
117 return LoggingLevel::Alert;
118 }
119 if (value == "emergency") {
120 return LoggingLevel::Emergency;
121 }
122 return std::nullopt;
123}
124
127 const LoggingSetLevelParams& params) {
128 Json json = Json{{"level", logging_level_to_string(params.level)}};
129 if (params.meta.has_value()) {
130 json["_meta"] = *params.meta;
131 }
133 return json;
134}
135
139 const Json& json) {
140 if (!json.is_object()) {
141 return mcp::core::unexpected(
142 logging_json_error("logging/setLevel params must be an object"));
143 }
144 if (!json.contains("level") || !json.at("level").is_string()) {
145 return mcp::core::unexpected(
146 logging_json_error("logging/setLevel params require a string level"));
147 }
148 const auto level =
149 logging_level_from_string(json.at("level").get<std::string>());
150 if (!level.has_value()) {
151 return mcp::core::unexpected(
152 logging_json_error("logging level is not supported"));
153 }
155 params.level = *level;
156 if (json.contains("_meta")) {
157 if (!json.at("_meta").is_object()) {
158 return mcp::core::unexpected(
159 logging_json_error("logging/setLevel _meta must be an object"));
160 }
161 params.meta = json.at("_meta");
162 }
163 params.extensions = collect_json_extensions(json, {"level", "_meta"});
164 return params;
165}
166
169 const LoggingMessageNotificationParams& params) {
170 Json json = Json::object();
171 json["level"] = logging_level_to_string(params.level);
172 if (params.logger.has_value()) {
173 json["logger"] = *params.logger;
174 }
175 json["data"] = params.data;
176 if (params.meta.has_value()) {
177 json["_meta"] = *params.meta;
178 }
180 return json;
181}
182
187 if (!json.is_object()) {
188 return mcp::core::unexpected(
189 logging_json_error("logging message params must be an object"));
190 }
191 if (!json.contains("level") || !json.at("level").is_string()) {
192 return mcp::core::unexpected(
193 logging_json_error("logging message params require a string level"));
194 }
195 if (!json.contains("data")) {
196 return mcp::core::unexpected(
197 logging_json_error("logging message params require data"));
198 }
199 const auto level =
200 logging_level_from_string(json.at("level").get<std::string>());
201 if (!level.has_value()) {
202 return mcp::core::unexpected(
203 logging_json_error("logging level is not supported"));
204 }
205
207 params.level = *level;
208 if (json.contains("logger")) {
209 if (!json.at("logger").is_string()) {
210 return mcp::core::unexpected(
211 logging_json_error("logging logger must be a string"));
212 }
213 params.logger = json.at("logger").get<std::string>();
214 }
215 params.data = json.at("data");
216 if (json.contains("_meta")) {
217 if (!json.at("_meta").is_object()) {
218 return mcp::core::unexpected(
219 logging_json_error("logging message _meta must be an object"));
220 }
221 params.meta = json.at("_meta");
222 }
223 params.extensions =
224 collect_json_extensions(json, {"level", "logger", "data", "_meta"});
225 return params;
226}
227
228} // namespace mcp::protocol
LoggingLevel
MCP logging severity levels.
Definition logging.hpp:22
@ Warning
Warning condition.
@ Notice
Normal but significant condition.
@ Critical
Critical condition.
@ Info
Informational messages.
@ Error
Error condition.
@ Emergency
System is unusable.
@ Debug
Detailed diagnostic messages.
@ Alert
Immediate action should be taken.
core::Result< LoggingSetLevelParams > logging_set_level_params_from_json(const Json &json)
Parses logging/setLevel params.
Definition logging.hpp:138
core::Error logging_json_error(std::string message)
Builds an InvalidRequest error for logging JSON validation failures.
Definition logging.hpp:66
core::Result< LoggingMessageNotificationParams > logging_message_notification_params_from_json(const Json &json)
Parses logging message notification params.
Definition logging.hpp:186
Json logging_message_notification_params_to_json(const LoggingMessageNotificationParams &params)
Serializes logging message notification params.
Definition logging.hpp:168
std::string logging_level_to_string(LoggingLevel level)
Converts a logging level to its MCP string value.
Definition logging.hpp:72
Json logging_set_level_params_to_json(const LoggingSetLevelParams &params)
Serializes logging/setLevel params.
Definition logging.hpp:126
std::optional< LoggingLevel > logging_level_from_string(const std::string &value)
Parses a logging level string.
Definition logging.hpp:96
Shared JSON, JSON-RPC, error, cancellation, and progress model types.
void append_json_extensions(Json &json, const Json &extensions)
Flattens extension members into a JSON object without overwriting typed fields.
Definition types.hpp:358
nlohmann::json Json
JSON value type used by all protocol DTOs.
Definition types.hpp:28
Json collect_json_extensions(const Json &json, std::initializer_list< std::string_view > known_keys)
Collects unknown object members so typed DTOs can preserve future protocol fields and vendor extensio...
Definition types.hpp:320
Shared result and error primitives used by the public cxxmcp SDK.
tl::expected< T, Error > Result
Alias for the SDK result type.
Definition result.hpp:64
Structured error returned by fallible SDK operations.
Definition result.hpp:35
Parameters for notifications/message.
Definition logging.hpp:52
std::optional< std::string > logger
Optional logger name or category.
Definition logging.hpp:56
std::optional< Json > meta
Optional _meta extension object preserved on the wire.
Definition logging.hpp:60
LoggingLevel level
Severity of this log message.
Definition logging.hpp:54
Json extensions
Unknown JSON members preserved for forward-compatible round trips.
Definition logging.hpp:62
Json data
Structured log payload.
Definition logging.hpp:58
Parameters for logging/setLevel.
Definition logging.hpp:42
Json extensions
Unknown JSON members preserved for forward-compatible round trips.
Definition logging.hpp:48
LoggingLevel level
Minimum level the receiver should emit after the request.
Definition logging.hpp:44
std::optional< Json > meta
Optional _meta extension object preserved on the wire.
Definition logging.hpp:46