19namespace mcp::protocol {
26 std::optional<std::string>
title;
69inline core::Error initialize_json_error(std::string message) {
71 static_cast<int>(ErrorCode::InvalidRequest), std::move(message), {}};
74inline Json implementation_info_to_json(
const ImplementationInfo& info) {
75 Json json = Json{{
"name", info.name}, {
"version", info.version}};
76 if (info.title.has_value()) {
77 json[
"title"] = *info.title;
79 if (info.description.has_value()) {
80 json[
"description"] = *info.description;
82 if (!info.icons.empty()) {
83 json[
"icons"] = Json::array();
84 for (
const auto& icon : info.icons) {
88 if (info.website_url.has_value()) {
89 json[
"websiteUrl"] = *info.website_url;
91 if (info.meta.has_value()) {
92 json[
"_meta"] = *info.meta;
98inline core::Result<ImplementationInfo> implementation_info_from_json(
100 if (!json.is_object()) {
102 initialize_json_error(
"implementation info must be an object"));
104 if (!json.contains(
"name") || !json.at(
"name").is_string()) {
106 initialize_json_error(
"implementation info requires a string name"));
108 if (!json.contains(
"version") || !json.at(
"version").is_string()) {
110 initialize_json_error(
"implementation info requires a string version"));
112 ImplementationInfo info;
113 info.name = json.at(
"name").get<std::string>();
114 info.version = json.at(
"version").get<std::string>();
115 if (json.contains(
"title")) {
116 if (!json.at(
"title").is_string()) {
118 initialize_json_error(
"implementation info title must be a string"));
120 info.title = json.at(
"title").get<std::string>();
122 if (json.contains(
"description")) {
123 if (!json.at(
"description").is_string()) {
125 "implementation info description must be a string"));
127 info.description = json.at(
"description").get<std::string>();
129 if (json.contains(
"icons")) {
130 if (!json.at(
"icons").is_array()) {
132 initialize_json_error(
"implementation info icons must be an array"));
134 for (
const auto& item : json.at(
"icons")) {
136 if (!icon.has_value()) {
138 "implementation info icons must contain valid icon objects"));
140 info.icons.push_back(*icon);
143 if (json.contains(
"websiteUrl")) {
144 if (!json.at(
"websiteUrl").is_string()) {
146 "implementation info websiteUrl must be a string"));
148 info.website_url = json.at(
"websiteUrl").get<std::string>();
150 if (json.contains(
"_meta")) {
151 if (!json.at(
"_meta").is_object()) {
153 initialize_json_error(
"implementation info _meta must be an object"));
155 info.meta = json.at(
"_meta");
159 "icons",
"websiteUrl",
"_meta"});
163inline Json initialize_params_to_json(
const InitializeParams& params) {
165 {
"protocolVersion", params.protocol_version},
167 {
"clientInfo", implementation_info_to_json(params.client_info)},
169 if (params.meta.has_value()) {
170 json[
"_meta"] = *params.meta;
176inline core::Result<InitializeParams> initialize_params_from_json(
178 if (!json.is_object()) {
180 initialize_json_error(
"initialize params must be an object"));
182 if (!json.contains(
"protocolVersion") ||
183 !json.at(
"protocolVersion").is_string()) {
185 "initialize params require a string protocolVersion"));
187 if (!json.contains(
"capabilities") || !json.at(
"capabilities").is_object()) {
189 initialize_json_error(
"initialize params require object capabilities"));
191 if (!json.contains(
"clientInfo")) {
193 initialize_json_error(
"initialize params require clientInfo"));
195 const auto capabilities =
197 if (!capabilities.has_value()) {
199 initialize_json_error(
"initialize params capabilities are invalid"));
201 const auto client_info = implementation_info_from_json(json.at(
"clientInfo"));
205 InitializeParams params;
206 params.protocol_version = json.at(
"protocolVersion").get<std::string>();
207 params.capabilities = *capabilities;
208 params.client_info = *client_info;
209 if (json.contains(
"_meta")) {
210 if (!json.at(
"_meta").is_object()) {
212 initialize_json_error(
"initialize params _meta must be an object"));
214 params.meta = json.at(
"_meta");
217 json, {
"protocolVersion",
"capabilities",
"clientInfo",
"_meta"});
221inline Json initialize_result_to_json(
const InitializeResult& result) {
223 {
"protocolVersion", result.protocol_version},
225 {
"serverInfo", implementation_info_to_json(result.server_info)},
227 if (result.instructions.has_value()) {
228 json[
"instructions"] = *result.instructions;
234inline core::Result<InitializeResult> initialize_result_from_json(
236 if (!json.is_object()) {
238 initialize_json_error(
"initialize result must be an object"));
240 if (!json.contains(
"protocolVersion") ||
241 !json.at(
"protocolVersion").is_string()) {
243 "initialize result requires a string protocolVersion"));
245 if (!json.contains(
"capabilities") || !json.at(
"capabilities").is_object()) {
247 "initialize result requires object capabilities"));
249 if (!json.contains(
"serverInfo")) {
251 initialize_json_error(
"initialize result requires serverInfo"));
253 const auto capabilities =
255 if (!capabilities.has_value()) {
257 initialize_json_error(
"initialize result capabilities are invalid"));
259 const auto server_info = implementation_info_from_json(json.at(
"serverInfo"));
263 InitializeResult result;
264 result.protocol_version = json.at(
"protocolVersion").get<std::string>();
265 result.capabilities = *capabilities;
266 result.server_info = *server_info;
267 if (json.contains(
"instructions")) {
268 if (!json.at(
"instructions").is_string()) {
270 "initialize result instructions must be a string"));
272 result.instructions = json.at(
"instructions").get<std::string>();
275 json, {
"protocolVersion",
"capabilities",
"serverInfo",
"instructions"});
MCP client and server capability declarations.
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
std::optional< ClientCapabilities > client_capabilities_from_json(const Json &json)
Parses client capabilities from an initialize request.
Definition capabilities.hpp:636
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.
constexpr auto unexpected(E &&value)
Creates an unexpected result value for the active expected backend.
Definition result.hpp:24
JSON-RPC method names and message construction/parsing helpers.
constexpr core::StringConstant McpProtocolVersion
Latest MCP protocol version advertised during initialization.
Definition serialization.hpp:35
Structured error returned by fallible SDK operations.
Definition result.hpp:35
Capabilities advertised by an MCP client during initialization.
Definition capabilities.hpp:296
Client or server implementation identity.
Definition initialize.hpp:22
Json extensions
Unknown JSON members preserved for forward-compatible round trips.
Definition initialize.hpp:38
std::optional< Json > meta
Optional _meta extension object preserved on the wire.
Definition initialize.hpp:36
std::string version
Human-readable implementation version.
Definition initialize.hpp:28
std::string name
Human-readable implementation name.
Definition initialize.hpp:24
std::optional< std::string > website_url
Optional project or documentation website URL.
Definition initialize.hpp:34
std::optional< std::string > title
Optional display title.
Definition initialize.hpp:26
std::optional< std::string > description
Optional display description.
Definition initialize.hpp:30
std::vector< Icon > icons
Optional icon descriptors.
Definition initialize.hpp:32
Parameters for the initialize request.
Definition initialize.hpp:42
Json extensions
Unknown JSON members preserved for forward-compatible round trips.
Definition initialize.hpp:52
std::optional< Json > meta
Optional protocol-level request metadata.
Definition initialize.hpp:50
ImplementationInfo client_info
Client implementation identity.
Definition initialize.hpp:48
ClientCapabilities capabilities
Client capabilities advertised during initialization.
Definition initialize.hpp:46
std::string protocol_version
Requested MCP protocol snapshot.
Definition initialize.hpp:44
Result payload for the initialize request.
Definition initialize.hpp:56
std::optional< std::string > instructions
Optional human-readable server usage instructions.
Definition initialize.hpp:64
Json extensions
Unknown JSON members preserved for forward-compatible round trips.
Definition initialize.hpp:66
ServerCapabilities capabilities
Server capabilities advertised during initialization.
Definition initialize.hpp:60
ImplementationInfo server_info
Server implementation identity.
Definition initialize.hpp:62
std::string protocol_version
Negotiated MCP protocol snapshot.
Definition initialize.hpp:58
Capabilities advertised by an MCP server in the initialize result.
Definition capabilities.hpp:458
Reflection specializations for DTOs defined in types.hpp.
Json icon_to_json(const Icon &icon)
Serializes a shared icon descriptor.
Definition types_reflect.hpp:109
std::optional< Icon > icon_from_json(const Json &json)
Parses a shared icon descriptor.
Definition types_reflect.hpp:114