cxxmcp 1.1.6
C++ MCP SDK
Loading...
Searching...
No Matches
capabilities.hpp
Go to the documentation of this file.
1// Copyright (c) 2025 [caomengxuan666]
2
3#pragma once
4
12
13#include <optional>
14#include <string>
15#include <utility>
16
19
20namespace mcp::protocol {
21
25 bool enabled = false;
27 bool list_changed = false;
31 Json raw = Json::object();
32};
33
37 bool enabled = false;
39 bool list_changed = false;
43 bool subscribe = false;
45 bool subscribe_present = false;
47 Json raw = Json::object();
48};
49
53 bool enabled = false;
55 bool list_changed = false;
59 Json raw = Json::object();
60};
61
66 bool enabled = false;
68 Json raw = Json::object();
69};
70
74 bool enabled = false;
76 bool tools = false;
78 bool context = false;
80 Json raw = Json::object();
81};
82
86 bool enabled = false;
88 Json raw = Json::object();
89};
90
94 bool enabled = false;
96 bool list_changed = false;
100 Json raw = Json::object();
101};
102
106 bool present = false;
108 bool form = false;
110 std::optional<bool> form_schema_validation;
112 bool url = false;
114 Json raw = Json::object();
115
118 bool enabled() const noexcept { return form || url; }
119};
120
127 bool list = false;
129 bool cancel = false;
131 bool tools_call = false;
135 bool elicitation_create = false;
137 Json raw = Json::object();
138};
139
140inline Json capability_raw_object(const Json& raw) {
141 return raw.is_object() ? raw : Json::object();
142}
143
144inline Json capability_member_object(const Json& object,
145 const std::string& key) {
146 if (object.is_object() && object.contains(key) &&
147 object.at(key).is_object()) {
148 return object.at(key);
149 }
150 return Json::object();
151}
152
157 Json tasks = capability_raw_object(capabilities.raw);
158 if (capabilities.list) {
159 tasks["list"] = capability_member_object(tasks, "list");
160 }
161 if (capabilities.cancel) {
162 tasks["cancel"] = capability_member_object(tasks, "cancel");
163 }
164
165 Json requests = capability_member_object(tasks, "requests");
166 if (capabilities.tools_call) {
167 Json tools = capability_member_object(requests, "tools");
168 tools["call"] = capability_member_object(tools, "call");
169 requests["tools"] = std::move(tools);
170 }
171 if (capabilities.sampling_create_message) {
172 Json sampling = capability_member_object(requests, "sampling");
173 sampling["createMessage"] =
174 capability_member_object(sampling, "createMessage");
175 requests["sampling"] = std::move(sampling);
176 }
177 if (capabilities.elicitation_create) {
178 Json elicitation = capability_member_object(requests, "elicitation");
179 elicitation["create"] = capability_member_object(elicitation, "create");
180 requests["elicitation"] = std::move(elicitation);
181 }
182 if (!requests.empty()) {
183 tasks["requests"] = std::move(requests);
184 }
185 return tasks;
186}
187
191inline bool capability_member_enabled(const Json& json) {
192 return json.is_object() || (json.is_boolean() && json.get<bool>());
193}
194
199 TaskCapabilities task_capabilities;
200 if (!tasks.is_object()) {
201 return task_capabilities;
202 }
203 task_capabilities.raw = tasks;
204
205 if (tasks.contains("list")) {
206 task_capabilities.list = capability_member_enabled(tasks.at("list"));
207 }
208 if (tasks.contains("cancel")) {
209 task_capabilities.cancel = capability_member_enabled(tasks.at("cancel"));
210 }
211 if (tasks.contains("requests") && tasks.at("requests").is_object()) {
212 const auto& requests = tasks.at("requests");
213 if (requests.contains("tools") && requests.at("tools").is_object()) {
214 const auto& tools = requests.at("tools");
215 if (tools.contains("call")) {
216 task_capabilities.tools_call =
217 capability_member_enabled(tools.at("call"));
218 }
219 }
220 if (requests.contains("sampling") && requests.at("sampling").is_object()) {
221 const auto& sampling = requests.at("sampling");
222 if (sampling.contains("createMessage")) {
223 task_capabilities.sampling_create_message =
224 capability_member_enabled(sampling.at("createMessage"));
225 }
226 }
227 if (requests.contains("elicitation") &&
228 requests.at("elicitation").is_object()) {
229 const auto& elicitation = requests.at("elicitation");
230 if (elicitation.contains("create")) {
231 task_capabilities.elicitation_create =
232 capability_member_enabled(elicitation.at("create"));
233 }
234 }
235 }
236 return task_capabilities;
237}
238
239inline bool task_capability_member_valid(const Json& json) {
240 return json.is_object() || json.is_boolean();
241}
242
243inline bool task_capabilities_are_valid(const Json& tasks) {
244 if (!tasks.is_object()) {
245 return false;
246 }
247 if (tasks.contains("list") &&
248 !task_capability_member_valid(tasks.at("list"))) {
249 return false;
250 }
251 if (tasks.contains("cancel") &&
252 !task_capability_member_valid(tasks.at("cancel"))) {
253 return false;
254 }
255 if (!tasks.contains("requests")) {
256 return true;
257 }
258 if (!tasks.at("requests").is_object()) {
259 return false;
260 }
261 const auto& requests = tasks.at("requests");
262 if (requests.contains("tools")) {
263 if (!requests.at("tools").is_object()) {
264 return false;
265 }
266 const auto& tools = requests.at("tools");
267 if (tools.contains("call") &&
268 !task_capability_member_valid(tools.at("call"))) {
269 return false;
270 }
271 }
272 if (requests.contains("sampling")) {
273 if (!requests.at("sampling").is_object()) {
274 return false;
275 }
276 const auto& sampling = requests.at("sampling");
277 if (sampling.contains("createMessage") &&
278 !task_capability_member_valid(sampling.at("createMessage"))) {
279 return false;
280 }
281 }
282 if (requests.contains("elicitation")) {
283 if (!requests.at("elicitation").is_object()) {
284 return false;
285 }
286 const auto& elicitation = requests.at("elicitation");
287 if (elicitation.contains("create") &&
288 !task_capability_member_valid(elicitation.at("create"))) {
289 return false;
290 }
291 }
292 return true;
293}
294
310
313 public:
314 ClientCapabilitiesBuilder& roots(bool list_changed = false) {
315 capabilities_.roots.enabled = true;
316 capabilities_.roots.list_changed = list_changed;
317 capabilities_.roots.list_changed_present = list_changed;
318 return *this;
319 }
320
321 ClientCapabilitiesBuilder& sampling(bool tools = false,
322 bool context = false) {
323 capabilities_.sampling.enabled = true;
324 capabilities_.sampling.tools = tools;
325 capabilities_.sampling.context = context;
326 return *this;
327 }
328
329 ClientCapabilitiesBuilder& elicitation_form(
330 std::optional<bool> schema_validation = std::nullopt) {
331 capabilities_.elicitation.present = true;
332 capabilities_.elicitation.form = true;
333 capabilities_.elicitation.form_schema_validation = schema_validation;
334 return *this;
335 }
336
337 ClientCapabilitiesBuilder& elicitation_url() {
338 capabilities_.elicitation.present = true;
339 capabilities_.elicitation.url = true;
340 return *this;
341 }
342
344 capabilities_.tasks = std::move(value);
345 return *this;
346 }
347
348 ClientCapabilitiesBuilder& task_list(bool value = true) {
349 ensure_tasks().list = value;
350 return *this;
351 }
352
353 ClientCapabilitiesBuilder& task_cancel(bool value = true) {
354 ensure_tasks().cancel = value;
355 return *this;
356 }
357
358 ClientCapabilitiesBuilder& task_tool_calls(bool value = true) {
359 ensure_tasks().tools_call = value;
360 return *this;
361 }
362
363 ClientCapabilitiesBuilder& task_sampling(bool value = true) {
364 ensure_tasks().sampling_create_message = value;
365 return *this;
366 }
367
368 ClientCapabilitiesBuilder& task_elicitation(bool value = true) {
369 ensure_tasks().elicitation_create = value;
370 return *this;
371 }
372
373 ClientCapabilitiesBuilder& experimental(Json value) {
374 capabilities_.experimental = std::move(value);
375 return *this;
376 }
377
378 ClientCapabilitiesBuilder& extension(std::string name, Json value) {
379 capabilities_.extensions[std::move(name)] = std::move(value);
380 return *this;
381 }
382
383 ClientCapabilities build() const { return capabilities_; }
384
385 private:
386 TaskCapabilities& ensure_tasks() {
387 if (!capabilities_.tasks.has_value()) {
388 capabilities_.tasks = TaskCapabilities{};
389 }
390 return *capabilities_.tasks;
391 }
392
393 ClientCapabilities capabilities_;
394};
395
400
405 const ClientCapabilities& capabilities) {
406 Json json = Json::object();
407
408 Json roots = capability_raw_object(capabilities.roots.raw);
409 if (capabilities.roots.list_changed ||
410 capabilities.roots.list_changed_present) {
411 roots["listChanged"] = capabilities.roots.list_changed;
412 }
413 if (capabilities.roots.enabled || !roots.empty()) {
414 json["roots"] = std::move(roots);
415 }
416
417 Json sampling = capability_raw_object(capabilities.sampling.raw);
418 if (capabilities.sampling.tools) {
419 sampling["tools"] = capability_member_object(sampling, "tools");
420 }
421 if (capabilities.sampling.context) {
422 sampling["context"] = capability_member_object(sampling, "context");
423 }
424 if (capabilities.sampling.enabled || !sampling.empty()) {
425 json["sampling"] = std::move(sampling);
426 }
427
428 Json elicitation = capability_raw_object(capabilities.elicitation.raw);
429 if (capabilities.elicitation.form) {
430 Json form = capability_member_object(elicitation, "form");
431 if (capabilities.elicitation.form_schema_validation.has_value()) {
432 form["schemaValidation"] =
434 }
435 elicitation["form"] = std::move(form);
436 }
437 if (capabilities.elicitation.url) {
438 elicitation["url"] = capability_member_object(elicitation, "url");
439 }
440 if (capabilities.elicitation.present || !elicitation.empty()) {
441 json["elicitation"] = std::move(elicitation);
442 }
443 if (capabilities.experimental.has_value() &&
444 capabilities.experimental->is_object()) {
445 json["experimental"] = *capabilities.experimental;
446 }
447 if (capabilities.extensions.is_object() && !capabilities.extensions.empty()) {
448 json["extensions"] = capabilities.extensions;
449 }
450 if (capabilities.tasks.has_value()) {
451 Json tasks = task_capabilities_to_json(*capabilities.tasks);
452 json["tasks"] = std::move(tasks);
453 }
454 return json;
455}
456
476
479 public:
480 ServerCapabilitiesBuilder& tools(bool list_changed = false) {
481 capabilities_.tools.enabled = true;
482 capabilities_.tools.list_changed = list_changed;
483 capabilities_.tools.list_changed_present = list_changed;
484 return *this;
485 }
486
487 ServerCapabilitiesBuilder& resources(bool list_changed = false,
488 bool subscribe = false) {
489 capabilities_.resources.enabled = true;
490 capabilities_.resources.list_changed = list_changed;
491 capabilities_.resources.list_changed_present = list_changed;
492 capabilities_.resources.subscribe = subscribe;
493 capabilities_.resources.subscribe_present = subscribe;
494 return *this;
495 }
496
497 ServerCapabilitiesBuilder& prompts(bool list_changed = false) {
498 capabilities_.prompts.enabled = true;
499 capabilities_.prompts.list_changed = list_changed;
500 capabilities_.prompts.list_changed_present = list_changed;
501 return *this;
502 }
503
504 ServerCapabilitiesBuilder& logging() {
505 capabilities_.logging.enabled = true;
506 return *this;
507 }
508
509 ServerCapabilitiesBuilder& completions() {
510 capabilities_.completions.enabled = true;
511 return *this;
512 }
513
515 capabilities_.tasks = std::move(value);
516 return *this;
517 }
518
519 ServerCapabilitiesBuilder& task_list(bool value = true) {
520 ensure_tasks().list = value;
521 return *this;
522 }
523
524 ServerCapabilitiesBuilder& task_cancel(bool value = true) {
525 ensure_tasks().cancel = value;
526 return *this;
527 }
528
529 ServerCapabilitiesBuilder& task_tool_calls(bool value = true) {
530 ensure_tasks().tools_call = value;
531 return *this;
532 }
533
534 ServerCapabilitiesBuilder& task_sampling(bool value = true) {
535 ensure_tasks().sampling_create_message = value;
536 return *this;
537 }
538
539 ServerCapabilitiesBuilder& task_elicitation(bool value = true) {
540 ensure_tasks().elicitation_create = value;
541 return *this;
542 }
543
544 ServerCapabilitiesBuilder& experimental(Json value) {
545 capabilities_.experimental = std::move(value);
546 return *this;
547 }
548
549 ServerCapabilitiesBuilder& extension(std::string name, Json value) {
550 capabilities_.extensions[std::move(name)] = std::move(value);
551 return *this;
552 }
553
554 ServerCapabilities build() const { return capabilities_; }
555
556 private:
557 TaskCapabilities& ensure_tasks() {
558 if (!capabilities_.tasks.has_value()) {
559 capabilities_.tasks = TaskCapabilities{};
560 }
561 return *capabilities_.tasks;
562 }
563
564 ServerCapabilities capabilities_;
565};
566
571
576 const ServerCapabilities& capabilities) {
577 Json json = Json::object();
578
579 Json tools = capability_raw_object(capabilities.tools.raw);
580 if (capabilities.tools.list_changed ||
581 capabilities.tools.list_changed_present) {
582 tools["listChanged"] = capabilities.tools.list_changed;
583 }
584 if (capabilities.tools.enabled || !tools.empty()) {
585 json["tools"] = std::move(tools);
586 }
587
588 Json resources = capability_raw_object(capabilities.resources.raw);
589 if (capabilities.resources.list_changed ||
590 capabilities.resources.list_changed_present) {
591 resources["listChanged"] = capabilities.resources.list_changed;
592 }
593 if (capabilities.resources.subscribe ||
594 capabilities.resources.subscribe_present) {
595 resources["subscribe"] = capabilities.resources.subscribe;
596 }
597 if (capabilities.resources.enabled || !resources.empty()) {
598 json["resources"] = std::move(resources);
599 }
600
601 Json prompts = capability_raw_object(capabilities.prompts.raw);
602 if (capabilities.prompts.list_changed ||
603 capabilities.prompts.list_changed_present) {
604 prompts["listChanged"] = capabilities.prompts.list_changed;
605 }
606 if (capabilities.prompts.enabled || !prompts.empty()) {
607 json["prompts"] = std::move(prompts);
608 }
609
610 if (capabilities.logging.enabled || (capabilities.logging.raw.is_object() &&
611 !capabilities.logging.raw.empty())) {
612 json["logging"] = capability_raw_object(capabilities.logging.raw);
613 }
614 if (capabilities.completions.enabled ||
615 (capabilities.completions.raw.is_object() &&
616 !capabilities.completions.raw.empty())) {
617 json["completions"] = capability_raw_object(capabilities.completions.raw);
618 }
619 if (capabilities.tasks.has_value()) {
620 Json tasks = task_capabilities_to_json(*capabilities.tasks);
621 json["tasks"] = std::move(tasks);
622 }
623 if (capabilities.experimental.has_value() &&
624 capabilities.experimental->is_object()) {
625 json["experimental"] = *capabilities.experimental;
626 }
627 if (capabilities.extensions.is_object() && !capabilities.extensions.empty()) {
628 json["extensions"] = capabilities.extensions;
629 }
630 return json;
631}
632
636inline std::optional<ClientCapabilities> client_capabilities_from_json(
637 const Json& json) {
638 if (!json.is_object()) {
639 return std::nullopt;
640 }
641
642 ClientCapabilities capabilities;
643 if (json.contains("roots")) {
644 if (!json.at("roots").is_object()) {
645 return std::nullopt;
646 }
647 capabilities.roots.enabled = true;
648 const auto& roots = json.at("roots");
649 capabilities.roots.raw = roots;
650 if (roots.contains("listChanged")) {
651 if (!roots.at("listChanged").is_boolean()) {
652 return std::nullopt;
653 }
654 capabilities.roots.list_changed = roots.at("listChanged").get<bool>();
655 capabilities.roots.list_changed_present = true;
656 }
657 }
658 if (json.contains("sampling")) {
659 if (!json.at("sampling").is_object()) {
660 return std::nullopt;
661 }
662 capabilities.sampling.enabled = true;
663 const auto& sampling = json.at("sampling");
664 capabilities.sampling.raw = sampling;
665 if (sampling.contains("tools")) {
666 if (!sampling.at("tools").is_object()) {
667 return std::nullopt;
668 }
669 capabilities.sampling.tools = true;
670 }
671 if (sampling.contains("context")) {
672 if (!sampling.at("context").is_object()) {
673 return std::nullopt;
674 }
675 capabilities.sampling.context = true;
676 }
677 }
678 if (json.contains("elicitation")) {
679 const auto& elicitation = json.at("elicitation");
680 if (!elicitation.is_object()) {
681 return std::nullopt;
682 }
683 capabilities.elicitation.present = true;
684 capabilities.elicitation.raw = elicitation;
685 if (elicitation.contains("form")) {
686 if (!elicitation.at("form").is_object()) {
687 return std::nullopt;
688 }
689 capabilities.elicitation.form = true;
690 const auto& form = elicitation.at("form");
691 if (form.contains("schemaValidation")) {
692 if (!form.at("schemaValidation").is_boolean()) {
693 return std::nullopt;
694 }
696 form.at("schemaValidation").get<bool>();
697 }
698 }
699 if (elicitation.contains("url")) {
700 if (!elicitation.at("url").is_object()) {
701 return std::nullopt;
702 }
703 capabilities.elicitation.url = true;
704 }
705 }
706 if (json.contains("tasks")) {
707 if (!task_capabilities_are_valid(json.at("tasks"))) {
708 return std::nullopt;
709 }
710 capabilities.tasks = task_capabilities_from_json(json.at("tasks"));
711 }
712 if (json.contains("experimental")) {
713 if (!json.at("experimental").is_object()) {
714 return std::nullopt;
715 }
716 capabilities.experimental = json.at("experimental");
717 }
718 if (json.contains("extensions")) {
719 if (!json.at("extensions").is_object()) {
720 return std::nullopt;
721 }
722 capabilities.extensions = json.at("extensions");
723 }
724 return capabilities;
725}
726
730inline std::optional<ServerCapabilities> server_capabilities_from_json(
731 const Json& json) {
732 if (!json.is_object()) {
733 return std::nullopt;
734 }
735
736 ServerCapabilities capabilities;
737 if (json.contains("tools")) {
738 if (!json.at("tools").is_object()) {
739 return std::nullopt;
740 }
741 capabilities.tools.enabled = true;
742 const auto& tools = json.at("tools");
743 capabilities.tools.raw = tools;
744 if (tools.contains("listChanged")) {
745 if (!tools.at("listChanged").is_boolean()) {
746 return std::nullopt;
747 }
748 capabilities.tools.list_changed = tools.at("listChanged").get<bool>();
749 capabilities.tools.list_changed_present = true;
750 }
751 }
752
753 if (json.contains("resources")) {
754 if (!json.at("resources").is_object()) {
755 return std::nullopt;
756 }
757 capabilities.resources.enabled = true;
758 const auto& resources = json.at("resources");
759 capabilities.resources.raw = resources;
760 if (resources.contains("listChanged")) {
761 if (!resources.at("listChanged").is_boolean()) {
762 return std::nullopt;
763 }
764 capabilities.resources.list_changed =
765 resources.at("listChanged").get<bool>();
766 capabilities.resources.list_changed_present = true;
767 }
768 if (resources.contains("subscribe")) {
769 if (!resources.at("subscribe").is_boolean()) {
770 return std::nullopt;
771 }
772 capabilities.resources.subscribe = resources.at("subscribe").get<bool>();
773 capabilities.resources.subscribe_present = true;
774 }
775 }
776
777 if (json.contains("prompts")) {
778 if (!json.at("prompts").is_object()) {
779 return std::nullopt;
780 }
781 capabilities.prompts.enabled = true;
782 const auto& prompts = json.at("prompts");
783 capabilities.prompts.raw = prompts;
784 if (prompts.contains("listChanged")) {
785 if (!prompts.at("listChanged").is_boolean()) {
786 return std::nullopt;
787 }
788 capabilities.prompts.list_changed = prompts.at("listChanged").get<bool>();
789 capabilities.prompts.list_changed_present = true;
790 }
791 }
792
793 if (json.contains("logging")) {
794 if (!json.at("logging").is_object()) {
795 return std::nullopt;
796 }
797 capabilities.logging.enabled = true;
798 capabilities.logging.raw = json.at("logging");
799 }
800 if (json.contains("completions")) {
801 if (!json.at("completions").is_object()) {
802 return std::nullopt;
803 }
804 capabilities.completions.enabled = true;
805 capabilities.completions.raw = json.at("completions");
806 }
807 if (json.contains("tasks")) {
808 if (!task_capabilities_are_valid(json.at("tasks"))) {
809 return std::nullopt;
810 }
811 capabilities.tasks = task_capabilities_from_json(json.at("tasks"));
812 }
813 if (json.contains("experimental")) {
814 if (!json.at("experimental").is_object()) {
815 return std::nullopt;
816 }
817 capabilities.experimental = json.at("experimental");
818 }
819 if (json.contains("extensions")) {
820 if (!json.at("extensions").is_object()) {
821 return std::nullopt;
822 }
823 capabilities.extensions = json.at("extensions");
824 }
825 return capabilities;
826}
827
828} // namespace mcp::protocol
std::optional< ServerCapabilities > server_capabilities_from_json(const Json &json)
Parses server capabilities from an initialize result.
Definition capabilities.hpp:730
Json server_capabilities_to_json(const ServerCapabilities &capabilities)
Serializes server capabilities to the MCP initialize result shape.
Definition capabilities.hpp:575
Json client_capabilities_to_json(const ClientCapabilities &capabilities)
Serializes client capabilities to the MCP initialize payload shape.
Definition capabilities.hpp:404
ServerCapabilitiesBuilder server_capabilities()
Starts a fluent server capability builder.
Definition capabilities.hpp:568
ClientCapabilitiesBuilder client_capabilities()
Starts a fluent client capability builder.
Definition capabilities.hpp:397
TaskCapabilities task_capabilities_from_json(const Json &tasks)
Parses task capabilities from an MCP capability object.
Definition capabilities.hpp:198
Json task_capabilities_to_json(const TaskCapabilities &capabilities)
Serializes task capability flags using object presence semantics.
Definition capabilities.hpp:156
bool capability_member_enabled(const Json &json)
Interprets either modern object presence or legacy boolean presence.
Definition capabilities.hpp:191
std::optional< ClientCapabilities > client_capabilities_from_json(const Json &json)
Parses client capabilities from an initialize request.
Definition capabilities.hpp:636
Fluent builder for client initialize capabilities.
Definition capabilities.hpp:312
Fluent builder for server initialize result capabilities.
Definition capabilities.hpp:478
Shared JSON, JSON-RPC, error, cancellation, and progress model types.
nlohmann::json Json
JSON value type used by all protocol DTOs.
Definition types.hpp:28
Capabilities advertised by an MCP client during initialization.
Definition capabilities.hpp:296
std::optional< TaskCapabilities > tasks
Optional task support. Omitted when the client does not advertise tasks.
Definition capabilities.hpp:304
RootCapabilities roots
Roots feature support.
Definition capabilities.hpp:298
SamplingCapabilities sampling
Sampling feature support.
Definition capabilities.hpp:300
std::optional< Json > experimental
Experimental capability bag preserved as raw JSON.
Definition capabilities.hpp:306
ElicitationCapabilities elicitation
Elicitation feature support.
Definition capabilities.hpp:302
Json extensions
Vendor or SDK extension capability bag.
Definition capabilities.hpp:308
Server capability flags for completion requests.
Definition capabilities.hpp:84
bool enabled
Whether completion/complete is supported.
Definition capabilities.hpp:86
Json raw
Raw capability object preserved for future fields.
Definition capabilities.hpp:88
Client capability flags for elicitation.
Definition capabilities.hpp:104
bool url
Whether URL-based elicitation requests are supported.
Definition capabilities.hpp:112
bool present
Whether the elicitation capability family was explicitly advertised.
Definition capabilities.hpp:106
bool form
Whether form-based elicitation/create requests are supported.
Definition capabilities.hpp:108
Json raw
Raw capability object preserved for future fields.
Definition capabilities.hpp:114
std::optional< bool > form_schema_validation
Whether form elicitation can validate schemas locally.
Definition capabilities.hpp:110
bool enabled() const noexcept
Returns true when any elicitation mode is supported.
Definition capabilities.hpp:118
Server capability flags for logging.
Definition capabilities.hpp:63
bool enabled
Whether logging/setLevel and logging message notifications are supported.
Definition capabilities.hpp:66
Json raw
Raw capability object preserved for future fields.
Definition capabilities.hpp:68
Server capability flags for prompts.
Definition capabilities.hpp:51
Json raw
Raw capability object preserved for future fields.
Definition capabilities.hpp:59
bool list_changed
Whether notifications/prompts/list_changed may be emitted.
Definition capabilities.hpp:55
bool enabled
Whether the server supports prompt listing or retrieval.
Definition capabilities.hpp:53
bool list_changed_present
Whether listChanged was explicitly present on the wire.
Definition capabilities.hpp:57
Server capability flags for resources.
Definition capabilities.hpp:35
bool enabled
Whether the server supports resource listing or reading.
Definition capabilities.hpp:37
bool subscribe_present
Whether subscribe was explicitly present on the wire.
Definition capabilities.hpp:45
bool list_changed
Whether notifications/resources/list_changed may be emitted.
Definition capabilities.hpp:39
bool list_changed_present
Whether listChanged was explicitly present on the wire.
Definition capabilities.hpp:41
Json raw
Raw capability object preserved for future fields.
Definition capabilities.hpp:47
bool subscribe
Whether the server supports resource subscribe/unsubscribe methods.
Definition capabilities.hpp:43
Client capability flags for roots.
Definition capabilities.hpp:92
bool enabled
Whether the client supports roots/list.
Definition capabilities.hpp:94
bool list_changed_present
Whether listChanged was explicitly present on the wire.
Definition capabilities.hpp:98
bool list_changed
Whether notifications/roots/list_changed may be emitted.
Definition capabilities.hpp:96
Json raw
Raw capability object preserved for future fields.
Definition capabilities.hpp:100
Client capability flags for sampling requests from the server.
Definition capabilities.hpp:72
bool enabled
Whether the client accepts sampling/createMessage requests.
Definition capabilities.hpp:74
bool tools
Whether sampling requests may use tool-related context.
Definition capabilities.hpp:76
bool context
Whether sampling requests may use broader context.
Definition capabilities.hpp:78
Json raw
Raw capability object preserved for future fields.
Definition capabilities.hpp:80
Capabilities advertised by an MCP server in the initialize result.
Definition capabilities.hpp:458
LoggingCapabilities logging
Logging feature support.
Definition capabilities.hpp:466
ToolCapabilities tools
Tool feature support.
Definition capabilities.hpp:460
ResourceCapabilities resources
Resource feature support.
Definition capabilities.hpp:462
CompletionCapabilities completions
Completion feature support.
Definition capabilities.hpp:468
Json extensions
Vendor or SDK extension capability bag.
Definition capabilities.hpp:474
PromptCapabilities prompts
Prompt feature support.
Definition capabilities.hpp:464
std::optional< Json > experimental
Experimental capability bag preserved as raw JSON.
Definition capabilities.hpp:472
std::optional< TaskCapabilities > tasks
Optional task support. Omitted when the server does not advertise tasks.
Definition capabilities.hpp:470
Capability flags for asynchronous task support.
Definition capabilities.hpp:125
bool sampling_create_message
Whether sampling/createMessage requests may include task parameters.
Definition capabilities.hpp:133
bool tools_call
Whether tools/call requests may include task parameters.
Definition capabilities.hpp:131
Json raw
Raw capability object preserved for future fields.
Definition capabilities.hpp:137
bool cancel
Whether tasks/cancel is supported.
Definition capabilities.hpp:129
bool elicitation_create
Whether elicitation/create requests may include task parameters.
Definition capabilities.hpp:135
bool list
Whether tasks/list is supported.
Definition capabilities.hpp:127
Server capability flags for tool discovery and invocation.
Definition capabilities.hpp:23
bool list_changed
Whether notifications/tools/list_changed may be emitted.
Definition capabilities.hpp:27
bool enabled
Whether the server supports tool discovery or invocation.
Definition capabilities.hpp:25
bool list_changed_present
Whether listChanged was explicitly present on the wire.
Definition capabilities.hpp:29
Json raw
Raw capability object preserved for future fields.
Definition capabilities.hpp:31
Asynchronous task status and task-management payloads.