25namespace mcp::protocol {
44 case TaskStatus::Working:
46 case TaskStatus::InputRequired:
47 return "input_required";
48 case TaskStatus::Completed:
50 case TaskStatus::Failed:
52 case TaskStatus::Cancelled:
61 const std::string& value) {
62 if (value ==
"working") {
63 return TaskStatus::Working;
65 if (value ==
"input_required") {
66 return TaskStatus::InputRequired;
68 if (value ==
"completed") {
69 return TaskStatus::Completed;
71 if (value ==
"failed") {
72 return TaskStatus::Failed;
74 if (value ==
"cancelled") {
75 return TaskStatus::Cancelled;
83 static void serialize(
Json& json,
const char* key,
TaskStatus value) {
86 static bool deserialize(
const Json& json,
const char* key,
88 if (!json.contains(key) || !json.at(key).is_string()) {
92 if (!val.has_value()) {
103 std::optional<std::int64_t>
ttl;
112 static constexpr bool defined =
true;
113 static auto fields() {
114 return std::make_tuple(
119 static std::vector<std::string> known_keys() {
return {
"ttl",
"_meta"}; }
125 static void serialize(
Json& json,
const char* key,
129 static bool deserialize(
const Json& json,
const char* key,
131 if (!json.contains(key)) {
134 auto result = reflect_from_json<TaskRequestParameters>(json.at(key));
138 target = std::move(*result);
154 std::variant<std::monostate, std::int64_t>
ttl = std::monostate{};
166 static constexpr bool defined =
true;
167 static auto fields() {
168 return std::make_tuple(
176 {
"taskId",
"status",
"statusMessage",
"createdAt",
177 "ttl",
"pollInterval",
"lastUpdatedAt"}));
179 static std::vector<std::string> known_keys() {
180 return {
"taskId",
"status",
"statusMessage",
"createdAt",
181 "ttl",
"pollInterval",
"lastUpdatedAt"};
198 static constexpr bool defined =
true;
199 static auto fields() {
200 return std::make_tuple(
205 static std::vector<std::string> known_keys() {
return {
"cursor",
"_meta"}; }
220 static constexpr bool defined =
true;
221 static auto fields() {
222 return std::make_tuple(
227 static std::vector<std::string> known_keys() {
return {
"taskId",
"_meta"}; }
245 static constexpr bool defined =
true;
246 static auto fields() {
247 return std::make_tuple(
252 static std::vector<std::string> known_keys() {
return {
"taskId",
"_meta"}; }
315 static_cast<int>(ErrorCode::InvalidRequest), std::move(message), {}};
328 return reflect_from_json<TaskRequestParameters>(json);
337 return reflect_from_json<Task>(json);
342 const std::optional<Json>& meta,
343 const Json& extensions) {
345 if (meta.has_value()) {
346 json[
"_meta"] = *meta;
354 const Json& json, std::string_view context) {
355 if (!json.is_object()) {
356 return mcp::core::unexpected(
361 return mcp::core::unexpected(task.error());
363 task->extensions.erase(
"_meta");
367 if (json.contains(
"_meta")) {
368 if (!json.at(
"_meta").is_object()) {
370 std::string(context) +
" result _meta must be an object"));
372 result.
meta = json.at(
"_meta");
375 json, {
"taskId",
"status",
"statusMessage",
"createdAt",
"ttl",
376 "pollInterval",
"lastUpdatedAt",
"_meta"});
389 return reflect_from_json<TaskListParams>(json);
400 return reflect_from_json<TaskGetParams>(json);
412 return reflect_from_json<TaskCancelParams>(json);
429 Json json = Json::object();
430 json[
"tasks"] = Json::array();
431 for (
const auto& task : result.
tasks) {
437 if (result.
total.has_value()) {
438 json[
"total"] = *result.
total;
440 if (result.
meta.has_value()) {
441 json[
"_meta"] = *result.
meta;
451 if (!json.is_object()) {
452 return mcp::core::unexpected(
455 if (!json.contains(
"tasks") || !json.at(
"tasks").is_array()) {
456 return mcp::core::unexpected(
461 for (
const auto& item : json.at(
"tasks")) {
464 return mcp::core::unexpected(task.error());
466 result.
tasks.push_back(*task);
468 if (json.contains(
"nextCursor")) {
469 if (!json.at(
"nextCursor").is_string()) {
470 return mcp::core::unexpected(
473 result.
next_cursor = json.at(
"nextCursor").get<std::string>();
475 if (json.contains(
"total")) {
476 if (!json.at(
"total").is_number_integer()) {
477 return mcp::core::unexpected(
480 const auto total = json.at(
"total").get<std::int64_t>();
482 return mcp::core::unexpected(
485 result.
total = total;
487 if (json.contains(
"_meta")) {
488 if (!json.at(
"_meta").is_object()) {
489 return mcp::core::unexpected(
492 result.
meta = json.at(
"_meta");
521 return mcp::core::unexpected(parsed.error());
524 result.
task = parsed->task;
525 result.
meta = parsed->meta;
536 Json json = Json::object();
537 if (result.
payload.is_object()) {
538 for (
const auto& [key, value] : result.
payload.items()) {
542 if (result.
meta.has_value()) {
543 json[
"_meta"] = *result.
meta;
553 if (!json.is_object()) {
554 return mcp::core::unexpected(
559 result.
payload = Json::object();
560 for (
const auto& [key, value] : json.items()) {
561 if (key !=
"_meta") {
565 if (json.contains(
"_meta")) {
566 if (!json.at(
"_meta").is_object()) {
567 return mcp::core::unexpected(
570 result.
meta = json.at(
"_meta");
577 Json json = Json::object();
579 if (result.
meta.has_value()) {
580 json[
"_meta"] = *result.
meta;
590 if (!json.is_object()) {
591 return mcp::core::unexpected(
594 if (!json.contains(
"task")) {
595 return mcp::core::unexpected(
601 return mcp::core::unexpected(task.error());
606 if (json.contains(
"_meta")) {
607 if (!json.at(
"_meta").is_object()) {
608 return mcp::core::unexpected(
611 result.
meta = json.at(
"_meta");
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
C++17 tuple-reflection infrastructure for zero-boilerplate DTO serialization.
#define CXXMCP_REFLECT_CHECK(Struct, expected_count)
Validates that a Reflect<> specialization covers the expected number of fields.
Definition reflect.hpp:1008
constexpr FieldDescriptor< Struct, Field > field(const char *wire_name, Field Struct::*pointer)
Creates a FieldDescriptor with wire name and pointer-to-member.
Definition reflect.hpp:75
constexpr FieldDescriptor< Struct, Field > nullable_field(const char *wire_name, Field Struct::*pointer)
Creates a FieldDescriptor whose missing wire value maps to std::monostate.
Definition reflect.hpp:134
ExtensionsField< Struct > extensions_field(Json Struct::*pointer, std::vector< std::string > own_keys)
Creates an ExtensionsField descriptor.
Definition reflect.hpp:90
Json reflect_to_json(const T &obj)
Serializes a DTO to JSON using its Reflect<T> trait.
Definition reflect.hpp:701
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
Result wrapper returned when a feature request creates a task.
Definition task.hpp:270
Json extensions
Unknown JSON members preserved for forward-compatible round trips.
Definition task.hpp:276
std::optional< Json > meta
Optional _meta extension object preserved on the wire.
Definition task.hpp:274
Task task
Created task snapshot.
Definition task.hpp:272
Type-specific serialization and deserialization logic.
Definition reflect.hpp:246
Primary template.
Definition reflect.hpp:199
Parameters for tasks/cancel.
Definition task.hpp:234
Json extensions
Unknown JSON members preserved for forward-compatible round trips.
Definition task.hpp:240
std::optional< Json > meta
Optional _meta extension object preserved on the wire.
Definition task.hpp:238
std::string task_id
Task identifier to cancel.
Definition task.hpp:236
Result object for tasks/cancel with task fields flattened.
Definition task.hpp:290
Json extensions
Unknown JSON members preserved for forward-compatible round trips.
Definition task.hpp:296
std::optional< Json > meta
Optional _meta extension object preserved on the wire.
Definition task.hpp:294
Task task
Cancelled task snapshot.
Definition task.hpp:292
Parameters for tasks/get.
Definition task.hpp:209
Json extensions
Unknown JSON members preserved for forward-compatible round trips.
Definition task.hpp:215
std::optional< Json > meta
Optional _meta extension object preserved on the wire.
Definition task.hpp:213
std::string task_id
Task identifier to retrieve.
Definition task.hpp:211
Result object for tasks/result (GetTaskPayloadResult equivalent).
Definition task.hpp:303
Json payload
The original request's result (polymorphic – may be any JSON value).
Definition task.hpp:305
Json extensions
Unknown JSON members preserved for forward-compatible round trips.
Definition task.hpp:309
std::optional< Json > meta
Optional _meta extension object preserved on the wire.
Definition task.hpp:307
Result object for tasks/get with task fields flattened.
Definition task.hpp:280
Task task
Retrieved task snapshot.
Definition task.hpp:282
std::optional< Json > meta
Optional _meta extension object preserved on the wire.
Definition task.hpp:284
Json extensions
Unknown JSON members preserved for forward-compatible round trips.
Definition task.hpp:286
Parameters for tasks/list.
Definition task.hpp:187
Json extensions
Unknown JSON members preserved for forward-compatible round trips.
Definition task.hpp:193
std::optional< Json > meta
Optional _meta extension object preserved on the wire.
Definition task.hpp:191
std::optional< std::string > cursor
Optional pagination cursor from a prior tasks/list result.
Definition task.hpp:189
Result object for tasks/list.
Definition task.hpp:256
Json extensions
Unknown JSON members preserved for forward-compatible round trips.
Definition task.hpp:266
std::optional< std::int64_t > total
Optional total number of tasks known to the peer.
Definition task.hpp:262
std::vector< Task > tasks
Page of tasks.
Definition task.hpp:258
std::optional< Json > meta
Optional _meta extension object preserved on the wire.
Definition task.hpp:264
std::optional< std::string > next_cursor
Optional cursor for retrieving the next page.
Definition task.hpp:260
Optional task parameters embedded in feature requests.
Definition task.hpp:101
Json extensions
Vendor or future task options preserved for forward compatibility.
Definition task.hpp:105
std::optional< std::int64_t > ttl
Optional requested time-to-live for the created task.
Definition task.hpp:103
std::optional< Json > meta
Optional _meta extension object preserved on the wire.
Definition task.hpp:107
Snapshot of an asynchronous task.
Definition task.hpp:144
std::string last_updated_at
Last update timestamp as a protocol string.
Definition task.hpp:158
std::optional< std::string > status_message
Optional human-readable status detail.
Definition task.hpp:150
Json extensions
Unknown JSON members preserved for forward-compatible round trips.
Definition task.hpp:160
std::variant< std::monostate, std::int64_t > ttl
Task time-to-live. Monostate serializes as JSON null.
Definition task.hpp:154
std::optional< std::int64_t > poll_interval
Optional recommended polling interval.
Definition task.hpp:156
std::string created_at
Creation timestamp as a protocol string.
Definition task.hpp:152
TaskStatus status
Current lifecycle status.
Definition task.hpp:148
std::string task_id
Stable task identifier used by task management methods.
Definition task.hpp:146
Json create_task_result_to_json(const CreateTaskResult &result)
Serializes a task creation result wrapper.
Definition task.hpp:576
std::string task_status_to_string(TaskStatus status)
Converts a task status to its MCP string value.
Definition task.hpp:42
core::Result< TaskGetResult > task_operation_result_from_json(const Json &json, std::string_view context)
Parses a flattened task result wrapper.
Definition task.hpp:353
std::optional< TaskStatus > task_status_from_string(const std::string &value)
Parses a task status string.
Definition task.hpp:60
core::Error task_json_error(std::string message)
Builds an InvalidRequest error for task JSON validation failures.
Definition task.hpp:313
Json task_request_parameters_to_json(const TaskRequestParameters ¶meters)
Serializes optional task request parameters.
Definition task.hpp:319
core::Result< TaskCancelParams > task_cancel_params_from_json(const Json &json)
Parses tasks/cancel params.
Definition task.hpp:410
Json task_cancel_result_to_json(const TaskCancelResult &result)
Serializes a tasks/cancel result with flattened task fields.
Definition task.hpp:511
core::Result< TaskGetPayloadResult > task_get_payload_result_from_json(const Json &json)
Parses a tasks/result payload result.
Definition task.hpp:551
TaskStatus
Lifecycle status for an asynchronous MCP task.
Definition task.hpp:28
@ Completed
Task completed successfully.
@ Working
Task is still running.
@ Cancelled
Task was cancelled.
@ InputRequired
Task is blocked waiting for additional input.
core::Result< TaskResultParams > task_result_params_from_json(const Json &json)
Parses tasks/result params.
Definition task.hpp:422
Json task_operation_result_to_json(const Task &task, const std::optional< Json > &meta, const Json &extensions)
Serializes a flattened task result wrapper.
Definition task.hpp:341
Json task_list_result_to_json(const TaskListResult &result)
Serializes a tasks/list result.
Definition task.hpp:428
core::Result< CreateTaskResult > create_task_result_from_json(const Json &json)
Parses a task creation result wrapper.
Definition task.hpp:588
core::Result< TaskRequestParameters > task_request_parameters_from_json(const Json &json)
Parses optional task request parameters.
Definition task.hpp:326
Json task_cancel_params_to_json(const TaskCancelParams ¶ms)
Serializes tasks/cancel params.
Definition task.hpp:404
core::Result< TaskCancelResult > task_cancel_result_from_json(const Json &json)
Parses a tasks/cancel result with flattened task fields.
Definition task.hpp:517
Json task_get_payload_result_to_json(const TaskGetPayloadResult &result)
Serializes a tasks/result payload result.
Definition task.hpp:534
Json task_result_params_to_json(const TaskResultParams ¶ms)
Serializes tasks/result params.
Definition task.hpp:416
core::Result< TaskGetResult > task_get_result_from_json(const Json &json)
Parses a tasks/get result with flattened task fields.
Definition task.hpp:506
core::Result< Task > task_from_json(const Json &json)
Parses a task snapshot.
Definition task.hpp:336
core::Result< TaskListParams > task_list_params_from_json(const Json &json)
Parses tasks/list params.
Definition task.hpp:387
Json task_list_params_to_json(const TaskListParams ¶ms)
Serializes tasks/list params.
Definition task.hpp:381
core::Result< TaskGetParams > task_get_params_from_json(const Json &json)
Parses tasks/get params.
Definition task.hpp:399
Json task_get_result_to_json(const TaskGetResult &result)
Serializes a tasks/get result with flattened task fields.
Definition task.hpp:500
Json task_get_params_to_json(const TaskGetParams ¶ms)
Serializes tasks/get params.
Definition task.hpp:393
Json task_to_json(const Task &task)
Serializes a task snapshot.
Definition task.hpp:332
core::Result< TaskListResult > task_list_result_from_json(const Json &json)
Parses a tasks/list result.
Definition task.hpp:449