cxxmcp 1.1.6
C++ MCP SDK
Loading...
Searching...
No Matches
initialize.hpp
Go to the documentation of this file.
1// Copyright (c) 2025 [caomengxuan666]
2
3#pragma once
4
7
8#include <optional>
9#include <string>
10#include <utility>
11#include <vector>
12
18
19namespace mcp::protocol {
20
24 std::string name;
26 std::optional<std::string> title;
28 std::string version;
30 std::optional<std::string> description;
32 std::vector<Icon> icons;
34 std::optional<std::string> website_url;
36 std::optional<Json> meta;
38 Json extensions = Json::object();
39};
40
54
68
69inline core::Error initialize_json_error(std::string message) {
70 return core::Error{
71 static_cast<int>(ErrorCode::InvalidRequest), std::move(message), {}};
72}
73
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;
78 }
79 if (info.description.has_value()) {
80 json["description"] = *info.description;
81 }
82 if (!info.icons.empty()) {
83 json["icons"] = Json::array();
84 for (const auto& icon : info.icons) {
85 json["icons"].push_back(icon_to_json(icon));
86 }
87 }
88 if (info.website_url.has_value()) {
89 json["websiteUrl"] = *info.website_url;
90 }
91 if (info.meta.has_value()) {
92 json["_meta"] = *info.meta;
93 }
94 append_json_extensions(json, info.extensions);
95 return json;
96}
97
98inline core::Result<ImplementationInfo> implementation_info_from_json(
99 const Json& json) {
100 if (!json.is_object()) {
102 initialize_json_error("implementation info must be an object"));
103 }
104 if (!json.contains("name") || !json.at("name").is_string()) {
106 initialize_json_error("implementation info requires a string name"));
107 }
108 if (!json.contains("version") || !json.at("version").is_string()) {
110 initialize_json_error("implementation info requires a string version"));
111 }
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"));
119 }
120 info.title = json.at("title").get<std::string>();
121 }
122 if (json.contains("description")) {
123 if (!json.at("description").is_string()) {
124 return mcp::core::unexpected(initialize_json_error(
125 "implementation info description must be a string"));
126 }
127 info.description = json.at("description").get<std::string>();
128 }
129 if (json.contains("icons")) {
130 if (!json.at("icons").is_array()) {
132 initialize_json_error("implementation info icons must be an array"));
133 }
134 for (const auto& item : json.at("icons")) {
135 const auto icon = icon_from_json(item);
136 if (!icon.has_value()) {
137 return mcp::core::unexpected(initialize_json_error(
138 "implementation info icons must contain valid icon objects"));
139 }
140 info.icons.push_back(*icon);
141 }
142 }
143 if (json.contains("websiteUrl")) {
144 if (!json.at("websiteUrl").is_string()) {
145 return mcp::core::unexpected(initialize_json_error(
146 "implementation info websiteUrl must be a string"));
147 }
148 info.website_url = json.at("websiteUrl").get<std::string>();
149 }
150 if (json.contains("_meta")) {
151 if (!json.at("_meta").is_object()) {
153 initialize_json_error("implementation info _meta must be an object"));
154 }
155 info.meta = json.at("_meta");
156 }
157 info.extensions =
158 collect_json_extensions(json, {"name", "title", "version", "description",
159 "icons", "websiteUrl", "_meta"});
160 return info;
161}
162
163inline Json initialize_params_to_json(const InitializeParams& params) {
164 Json json = Json{
165 {"protocolVersion", params.protocol_version},
166 {"capabilities", client_capabilities_to_json(params.capabilities)},
167 {"clientInfo", implementation_info_to_json(params.client_info)},
168 };
169 if (params.meta.has_value()) {
170 json["_meta"] = *params.meta;
171 }
172 append_json_extensions(json, params.extensions);
173 return json;
174}
175
176inline core::Result<InitializeParams> initialize_params_from_json(
177 const Json& json) {
178 if (!json.is_object()) {
180 initialize_json_error("initialize params must be an object"));
181 }
182 if (!json.contains("protocolVersion") ||
183 !json.at("protocolVersion").is_string()) {
184 return mcp::core::unexpected(initialize_json_error(
185 "initialize params require a string protocolVersion"));
186 }
187 if (!json.contains("capabilities") || !json.at("capabilities").is_object()) {
189 initialize_json_error("initialize params require object capabilities"));
190 }
191 if (!json.contains("clientInfo")) {
193 initialize_json_error("initialize params require clientInfo"));
194 }
195 const auto capabilities =
196 client_capabilities_from_json(json.at("capabilities"));
197 if (!capabilities.has_value()) {
199 initialize_json_error("initialize params capabilities are invalid"));
200 }
201 const auto client_info = implementation_info_from_json(json.at("clientInfo"));
202 if (!client_info) {
203 return mcp::core::unexpected(client_info.error());
204 }
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"));
213 }
214 params.meta = json.at("_meta");
215 }
216 params.extensions = collect_json_extensions(
217 json, {"protocolVersion", "capabilities", "clientInfo", "_meta"});
218 return params;
219}
220
221inline Json initialize_result_to_json(const InitializeResult& result) {
222 Json json = Json{
223 {"protocolVersion", result.protocol_version},
224 {"capabilities", server_capabilities_to_json(result.capabilities)},
225 {"serverInfo", implementation_info_to_json(result.server_info)},
226 };
227 if (result.instructions.has_value()) {
228 json["instructions"] = *result.instructions;
229 }
230 append_json_extensions(json, result.extensions);
231 return json;
232}
233
234inline core::Result<InitializeResult> initialize_result_from_json(
235 const Json& json) {
236 if (!json.is_object()) {
238 initialize_json_error("initialize result must be an object"));
239 }
240 if (!json.contains("protocolVersion") ||
241 !json.at("protocolVersion").is_string()) {
242 return mcp::core::unexpected(initialize_json_error(
243 "initialize result requires a string protocolVersion"));
244 }
245 if (!json.contains("capabilities") || !json.at("capabilities").is_object()) {
246 return mcp::core::unexpected(initialize_json_error(
247 "initialize result requires object capabilities"));
248 }
249 if (!json.contains("serverInfo")) {
251 initialize_json_error("initialize result requires serverInfo"));
252 }
253 const auto capabilities =
254 server_capabilities_from_json(json.at("capabilities"));
255 if (!capabilities.has_value()) {
257 initialize_json_error("initialize result capabilities are invalid"));
258 }
259 const auto server_info = implementation_info_from_json(json.at("serverInfo"));
260 if (!server_info) {
261 return mcp::core::unexpected(server_info.error());
262 }
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()) {
269 return mcp::core::unexpected(initialize_json_error(
270 "initialize result instructions must be a string"));
271 }
272 result.instructions = json.at("instructions").get<std::string>();
273 }
274 result.extensions = collect_json_extensions(
275 json, {"protocolVersion", "capabilities", "serverInfo", "instructions"});
276 return result;
277}
278
279} // namespace mcp::protocol
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