cxxmcp 1.1.6
C++ MCP SDK
Loading...
Searching...
No Matches
handler.hpp
Go to the documentation of this file.
1// Copyright (c) 2025 [caomengxuan666]
2
3#pragma once
4
7
8#include <memory>
9#include <stdexcept>
10#include <utility>
11
13
14namespace mcp::server {
15
17inline core::Error handler_method_not_found(std::string_view message) {
18 return core::Error{
19 static_cast<int>(protocol::ErrorCode::MethodNotFound),
20 std::string(message),
21 {},
22 };
23}
24
27 using JsonHandler = Server::JsonHandler;
28 using JsonContextHandler = Server::JsonContextHandler;
29 using JsonRequestContextHandler = Server::JsonRequestContextHandler;
30 using LoggingHandler = Server::LoggingHandler;
31 using RawRequestHandler = Server::RawRequestHandler;
32 using RawNotificationHandler = Server::RawNotificationHandler;
33 using ToolsListHandler = Server::ToolsListHandler;
34 using PromptsListHandler = Server::PromptsListHandler;
35 using ResourcesListHandler = Server::ResourcesListHandler;
36 using ResourceTemplatesListHandler = Server::ResourceTemplatesListHandler;
37 using TaskListHandler = Server::TaskListHandler;
38 using TaskGetHandler = Server::TaskGetHandler;
39 using TaskCancelHandler = Server::TaskCancelHandler;
40 using TaskResultHandler = Server::TaskResultHandler;
41 using RootsListChangedHandler = Server::RootsListChangedHandler;
42 using ProgressHandler = Server::ProgressHandler;
43 using ListChangedHandler = Server::ListChangedHandler;
44 using ResourceUpdatedHandler = Server::ResourceUpdatedHandler;
45
46 virtual ~ServerHandlerInterface() = default;
47
48 virtual std::optional<core::Result<protocol::ToolsListResult>> on_list_tools(
49 const SessionContext&) const {
50 return std::nullopt;
51 }
52 virtual std::optional<core::Result<protocol::ToolsListResult>> on_list_tools(
54 const SessionContext& context) const {
55 (void)params;
56 return on_list_tools(context);
57 }
58 virtual std::optional<core::Result<protocol::ToolDefinition>> on_get_tool(
59 std::string_view, const SessionContext&) const {
60 return std::nullopt;
61 }
62 virtual std::optional<core::Result<protocol::PromptsListResult>>
63 on_list_prompts(const SessionContext&) const {
64 return std::nullopt;
65 }
66 virtual std::optional<core::Result<protocol::PromptsListResult>>
67 on_list_prompts(const protocol::PaginatedRequestParams& params,
68 const SessionContext& context) const {
69 (void)params;
70 return on_list_prompts(context);
71 }
72 virtual std::optional<core::Result<protocol::ResourcesListResult>>
73 on_list_resources(const SessionContext&) const {
74 return std::nullopt;
75 }
76 virtual std::optional<core::Result<protocol::ResourcesListResult>>
77 on_list_resources(const protocol::PaginatedRequestParams& params,
78 const SessionContext& context) const {
79 (void)params;
80 return on_list_resources(context);
81 }
82 virtual std::optional<core::Result<protocol::ResourceTemplatesListResult>>
83 on_list_resource_templates(const SessionContext&) const {
84 return std::nullopt;
85 }
86 virtual std::optional<core::Result<protocol::ResourceTemplatesListResult>>
87 on_list_resource_templates(const protocol::PaginatedRequestParams& params,
88 const SessionContext& context) const {
89 (void)params;
90 return on_list_resource_templates(context);
91 }
92 virtual std::optional<core::Result<protocol::ToolResult>> on_call_tool(
93 const protocol::ToolCall&) const {
94 return std::nullopt;
95 }
96 virtual std::optional<core::Result<protocol::ToolResult>> on_call_tool(
97 const protocol::ToolCall& call, const SessionContext& context) const {
98 (void)context;
99 return on_call_tool(call);
100 }
101 virtual std::optional<core::Result<protocol::ToolResult>> on_call_tool(
102 const protocol::ToolCall& call, const SessionContext& context,
103 CancellationToken cancellation) const {
104 (void)cancellation;
105 return on_call_tool(call, context);
106 }
107 virtual std::optional<core::Result<protocol::PromptsGetResult>> on_get_prompt(
108 const protocol::PromptsGetParams&) const {
109 return std::nullopt;
110 }
111 virtual std::optional<core::Result<protocol::PromptsGetResult>> on_get_prompt(
112 const protocol::PromptsGetParams& params,
113 const SessionContext& context) const {
114 (void)context;
115 return on_get_prompt(params);
116 }
117 virtual std::optional<core::Result<protocol::PromptsGetResult>> on_get_prompt(
118 const protocol::PromptsGetParams& params, const SessionContext& context,
119 CancellationToken cancellation) const {
120 (void)cancellation;
121 return on_get_prompt(params, context);
122 }
123 virtual std::optional<core::Result<protocol::ResourcesReadResult>>
124 on_read_resource(const protocol::ResourcesReadParams&) const {
125 return std::nullopt;
126 }
127 virtual std::optional<core::Result<protocol::ResourcesReadResult>>
128 on_read_resource(const protocol::ResourcesReadParams& params,
129 const SessionContext& context) const {
130 (void)context;
131 return on_read_resource(params);
132 }
133 virtual std::optional<core::Result<protocol::ResourcesReadResult>>
134 on_read_resource(const protocol::ResourcesReadParams& params,
135 const SessionContext& context,
136 CancellationToken cancellation) const {
137 (void)cancellation;
138 return on_read_resource(params, context);
139 }
140
141 virtual std::optional<core::Result<protocol::Json>> on_completion(
142 const protocol::Json&) const {
143 return std::nullopt;
144 }
145 virtual std::optional<core::Result<protocol::Json>> on_completion(
146 const protocol::Json& params, const SessionContext& context) const {
147 (void)context;
148 return on_completion(params);
149 }
150 virtual std::optional<core::Result<protocol::Json>> on_completion(
151 const protocol::Json& params, const SessionContext& context,
152 CancellationToken cancellation) const {
153 (void)cancellation;
154 return on_completion(params, context);
155 }
156 virtual std::optional<core::Result<protocol::Json>> on_sampling(
157 const protocol::Json&) const {
158 return std::nullopt;
159 }
160 virtual std::optional<core::Result<protocol::Json>> on_sampling(
161 const protocol::Json& params, const SessionContext& context) const {
162 (void)context;
163 return on_sampling(params);
164 }
165 virtual std::optional<core::Result<protocol::Json>> on_sampling(
166 const protocol::Json& params, const SessionContext& context,
167 CancellationToken cancellation) const {
168 (void)cancellation;
169 return on_sampling(params, context);
170 }
171 virtual std::optional<core::Result<protocol::Json>> on_set_level(
172 const protocol::Json&) const {
173 return std::nullopt;
174 }
175 virtual std::optional<core::Result<protocol::Json>> on_set_level(
176 const protocol::Json& params, const SessionContext& context) const {
177 (void)context;
178 return on_set_level(params);
179 }
180 virtual std::optional<core::Result<protocol::Json>> on_set_level(
181 const protocol::Json& params, const SessionContext& context,
182 CancellationToken cancellation) const {
183 (void)cancellation;
184 return on_set_level(params, context);
185 }
186 virtual std::optional<core::Result<protocol::Json>> on_subscribe(
187 const protocol::Json&) const {
188 return std::nullopt;
189 }
190 virtual std::optional<core::Result<protocol::Json>> on_subscribe(
191 const protocol::Json& params, const SessionContext& context) const {
192 (void)context;
193 return on_subscribe(params);
194 }
195 virtual std::optional<core::Result<protocol::Json>> on_subscribe(
196 const protocol::Json& params, const SessionContext& context,
197 CancellationToken cancellation) const {
198 (void)cancellation;
199 return on_subscribe(params, context);
200 }
201 virtual std::optional<core::Result<protocol::Json>> on_unsubscribe(
202 const protocol::Json&) const {
203 return std::nullopt;
204 }
205 virtual std::optional<core::Result<protocol::Json>> on_unsubscribe(
206 const protocol::Json& params, const SessionContext& context) const {
207 (void)context;
208 return on_unsubscribe(params);
209 }
210 virtual std::optional<core::Result<protocol::Json>> on_unsubscribe(
211 const protocol::Json& params, const SessionContext& context,
212 CancellationToken cancellation) const {
213 (void)cancellation;
214 return on_unsubscribe(params, context);
215 }
216 virtual void on_logging(std::string_view, std::string_view) const {}
217 virtual std::optional<protocol::JsonRpcResponse> on_raw_request(
218 const protocol::JsonRpcRequest&, const SessionContext&) const {
219 return std::nullopt;
220 }
221 virtual std::optional<core::Result<core::Unit>> on_raw_notification(
222 const protocol::JsonRpcNotification&, const SessionContext&) const {
223 return std::nullopt;
224 }
225 virtual std::optional<protocol::JsonRpcResponse> on_custom_request(
226 const protocol::JsonRpcRequest& request,
227 const SessionContext& context) const {
228 return on_raw_request(request, context);
229 }
230 virtual std::optional<core::Result<core::Unit>> on_custom_notification(
231 const protocol::JsonRpcNotification& notification,
232 const SessionContext& context) const {
233 return on_raw_notification(notification, context);
234 }
235 virtual std::optional<core::Result<protocol::TaskListResult>> on_task_list(
236 const protocol::TaskListParams&) const {
237 return std::nullopt;
238 }
239 virtual std::optional<core::Result<protocol::TaskListResult>> on_task_list(
240 const protocol::TaskListParams& params,
241 const SessionContext& context) const {
242 (void)context;
243 return on_task_list(params);
244 }
245 virtual std::optional<core::Result<protocol::Task>> on_task_get(
246 const protocol::TaskGetParams&) const {
247 return std::nullopt;
248 }
249 virtual std::optional<core::Result<protocol::Task>> on_task_get(
250 const protocol::TaskGetParams& params,
251 const SessionContext& context) const {
252 (void)context;
253 return on_task_get(params);
254 }
255 virtual std::optional<core::Result<protocol::Task>> on_task_cancel(
256 const protocol::TaskCancelParams&) const {
257 return std::nullopt;
258 }
259 virtual std::optional<core::Result<protocol::Task>> on_task_cancel(
260 const protocol::TaskCancelParams& params,
261 const SessionContext& context) const {
262 (void)context;
263 return on_task_cancel(params);
264 }
265 virtual std::optional<core::Result<protocol::Json>> on_task_result(
266 const protocol::TaskResultParams&) const {
267 return std::nullopt;
268 }
269 virtual std::optional<core::Result<protocol::Json>> on_task_result(
270 const protocol::TaskResultParams& params,
271 const SessionContext& context) const {
272 (void)context;
273 return on_task_result(params);
274 }
275 virtual std::optional<core::Result<core::Unit>> on_progress(
277 return std::nullopt;
278 }
279 virtual std::optional<core::Result<core::Unit>> on_progress(
281 const SessionContext& context) const {
282 (void)context;
283 return on_progress(params);
284 }
285 virtual std::optional<core::Result<core::Unit>> on_roots_list_changed()
286 const {
287 return std::nullopt;
288 }
289 virtual std::optional<core::Result<core::Unit>> on_roots_list_changed(
290 const SessionContext& context) const {
291 (void)context;
292 return on_roots_list_changed();
293 }
294 virtual std::optional<core::Result<core::Unit>> on_tool_list_changed() const {
295 return std::nullopt;
296 }
297 virtual std::optional<core::Result<core::Unit>> on_tool_list_changed(
298 const SessionContext& context) const {
299 (void)context;
300 return on_tool_list_changed();
301 }
302 virtual std::optional<core::Result<core::Unit>> on_prompt_list_changed()
303 const {
304 return std::nullopt;
305 }
306 virtual std::optional<core::Result<core::Unit>> on_prompt_list_changed(
307 const SessionContext& context) const {
308 (void)context;
309 return on_prompt_list_changed();
310 }
311 virtual std::optional<core::Result<core::Unit>> on_resource_list_changed()
312 const {
313 return std::nullopt;
314 }
315 virtual std::optional<core::Result<core::Unit>> on_resource_list_changed(
316 const SessionContext& context) const {
317 (void)context;
318 return on_resource_list_changed();
319 }
320 virtual std::optional<core::Result<core::Unit>> on_resource_updated(
321 const std::string&) const {
322 return std::nullopt;
323 }
324 virtual std::optional<core::Result<core::Unit>> on_resource_updated(
325 const std::string& uri, const SessionContext& context) const {
326 (void)context;
327 return on_resource_updated(uri);
328 }
329};
330
331inline protocol::JsonRpcResponse server_handler_error_response(
332 const protocol::JsonRpcRequest& request, const core::Error& error) {
333 return protocol::make_error_response(
334 std::optional<protocol::RequestId>{request.id},
335 protocol::make_error(error.code, error.message,
336 error.detail.empty()
337 ? std::nullopt
338 : std::optional<protocol::Json>{error.detail}));
339}
340
341template <class T, class Serializer>
342inline std::optional<protocol::JsonRpcResponse> server_handler_result_response(
343 const protocol::JsonRpcRequest& request, const core::Result<T>& result,
344 Serializer serializer) {
345 if (!result) {
346 return server_handler_error_response(request, result.error());
347 }
348 return protocol::make_response(request.id, serializer(*result));
349}
350
351inline std::optional<protocol::JsonRpcResponse>
352dispatch_server_handler_discovery_request(
353 const ServerHandlerInterface& handler,
354 const protocol::JsonRpcRequest& request, const SessionContext& context) {
355 if (request.method == protocol::ToolsListMethod) {
356 const auto params =
357 protocol::paginated_request_params_from_json(request.params);
358 if (!params) {
359 return server_handler_error_response(
360 request, core::Error{
361 static_cast<int>(protocol::ErrorCode::InvalidParams),
362 "tools/list params must be an object with an optional "
363 "string cursor",
364 {},
365 });
366 }
367 const auto result = handler.on_list_tools(*params, context);
368 if (result.has_value()) {
369 return server_handler_result_response(
370 request, *result, [](const protocol::ToolsListResult& value) {
371 return protocol::tools_list_result_to_json(value);
372 });
373 }
374 return std::nullopt;
375 }
376
377 if (request.method == protocol::ToolsGetMethod) {
378 if (!request.params.is_object() || !request.params.contains("name") ||
379 !request.params.at("name").is_string()) {
380 return server_handler_error_response(
381 request, core::Error{
382 static_cast<int>(protocol::ErrorCode::InvalidParams),
383 "tools/get requires a string name",
384 {},
385 });
386 }
387 const auto result = handler.on_get_tool(
388 request.params.at("name").get<std::string>(), context);
389 if (result.has_value()) {
390 return server_handler_result_response(
391 request, *result, [](const protocol::ToolDefinition& value) {
392 return protocol::tool_definition_to_json(value);
393 });
394 }
395 return std::nullopt;
396 }
397
398 if (request.method == protocol::PromptsListMethod) {
399 const auto params =
400 protocol::paginated_request_params_from_json(request.params);
401 if (!params) {
402 return server_handler_error_response(
403 request, core::Error{
404 static_cast<int>(protocol::ErrorCode::InvalidParams),
405 "prompts/list params must be an object with an optional "
406 "string cursor",
407 {},
408 });
409 }
410 const auto result = handler.on_list_prompts(*params, context);
411 if (result.has_value()) {
412 return server_handler_result_response(
413 request, *result, [](const protocol::PromptsListResult& value) {
414 return protocol::prompts_list_result_to_json(value);
415 });
416 }
417 return std::nullopt;
418 }
419
420 if (request.method == protocol::ResourcesListMethod) {
421 const auto params =
422 protocol::paginated_request_params_from_json(request.params);
423 if (!params) {
424 return server_handler_error_response(
425 request, core::Error{
426 static_cast<int>(protocol::ErrorCode::InvalidParams),
427 "resources/list params must be an object with an "
428 "optional string cursor",
429 {},
430 });
431 }
432 const auto result = handler.on_list_resources(*params, context);
433 if (result.has_value()) {
434 return server_handler_result_response(
435 request, *result, [](const protocol::ResourcesListResult& value) {
436 return protocol::resources_list_result_to_json(value);
437 });
438 }
439 return std::nullopt;
440 }
441
442 if (request.method == protocol::ResourcesTemplatesListMethod) {
443 const auto params =
444 protocol::paginated_request_params_from_json(request.params);
445 if (!params) {
446 return server_handler_error_response(
447 request, core::Error{
448 static_cast<int>(protocol::ErrorCode::InvalidParams),
449 "resources/templates/list params must be an object with "
450 "an optional string cursor",
451 {},
452 });
453 }
454 const auto result = handler.on_list_resource_templates(*params, context);
455 if (result.has_value()) {
456 return server_handler_result_response(
457 request, *result,
458 [](const protocol::ResourceTemplatesListResult& value) {
459 return protocol::resource_templates_list_result_to_json(value);
460 });
461 }
462 }
463 return std::nullopt;
464}
465
466inline std::optional<protocol::JsonRpcResponse> dispatch_server_handler_request(
467 const ServerHandlerInterface& handler,
468 const protocol::JsonRpcRequest& request, const SessionContext& context,
469 CancellationToken cancellation) {
470 const auto discovery_response =
471 dispatch_server_handler_discovery_request(handler, request, context);
472 if (discovery_response.has_value()) {
473 return discovery_response;
474 }
475
476 if (request.method == protocol::ToolsCallMethod) {
477 const auto call = protocol::tool_call_from_json(request.params);
478 if (!call) {
479 return server_handler_error_response(request, call.error());
480 }
481 if (call->task.has_value()) {
482 return std::nullopt;
483 }
484 const auto result = handler.on_call_tool(*call, context, cancellation);
485 if (result.has_value()) {
486 return server_handler_result_response(
487 request, *result, [](const protocol::ToolResult& value) {
488 return protocol::tool_result_to_json(value);
489 });
490 }
491 return std::nullopt;
492 }
493
494 if (request.method == protocol::PromptsGetMethod) {
495 const auto params = protocol::prompts_get_params_from_json(request.params);
496 if (!params) {
497 return server_handler_error_response(request, params.error());
498 }
499 const auto result = handler.on_get_prompt(*params, context, cancellation);
500 if (result.has_value()) {
501 return server_handler_result_response(
502 request, *result, [](const protocol::PromptsGetResult& value) {
503 return protocol::prompts_get_result_to_json(value);
504 });
505 }
506 return std::nullopt;
507 }
508
509 if (request.method == protocol::ResourcesReadMethod) {
510 const auto params =
511 protocol::resources_read_params_from_json(request.params);
512 if (!params) {
513 return server_handler_error_response(request, params.error());
514 }
515 const auto result =
516 handler.on_read_resource(*params, context, cancellation);
517 if (result.has_value()) {
518 return server_handler_result_response(
519 request, *result, [](const protocol::ResourcesReadResult& value) {
520 return protocol::resources_read_result_to_json(value);
521 });
522 }
523 return std::nullopt;
524 }
525
526 if (request.method == protocol::LoggingSetLevelMethod) {
527 const auto result =
528 handler.on_set_level(request.params, context, cancellation);
529 if (result.has_value()) {
530 return server_handler_result_response(
531 request, *result, [](const protocol::Json& value) { return value; });
532 }
533 return std::nullopt;
534 }
535
536 if (request.method == protocol::ResourcesSubscribeMethod) {
537 const auto result =
538 handler.on_subscribe(request.params, context, cancellation);
539 if (result.has_value()) {
540 return server_handler_result_response(
541 request, *result, [](const protocol::Json& value) { return value; });
542 }
543 return std::nullopt;
544 }
545
546 if (request.method == protocol::ResourcesUnsubscribeMethod) {
547 const auto result =
548 handler.on_unsubscribe(request.params, context, cancellation);
549 if (result.has_value()) {
550 return server_handler_result_response(
551 request, *result, [](const protocol::Json& value) { return value; });
552 }
553 return std::nullopt;
554 }
555
556 return std::nullopt;
557}
558
565 using JsonHandler = Server::JsonHandler;
566 using JsonContextHandler = Server::JsonContextHandler;
567 using JsonRequestContextHandler = Server::JsonRequestContextHandler;
568 using LoggingHandler = Server::LoggingHandler;
569 using RawRequestHandler = Server::RawRequestHandler;
570 using RawNotificationHandler = Server::RawNotificationHandler;
571 using ToolsListHandler = Server::ToolsListHandler;
572 using PromptsListHandler = Server::PromptsListHandler;
573 using ResourcesListHandler = Server::ResourcesListHandler;
574 using ResourceTemplatesListHandler = Server::ResourceTemplatesListHandler;
575 using TaskListHandler = Server::TaskListHandler;
576 using TaskGetHandler = Server::TaskGetHandler;
577 using TaskCancelHandler = Server::TaskCancelHandler;
578 using TaskResultHandler = Server::TaskResultHandler;
579 using RootsListChangedHandler = Server::RootsListChangedHandler;
580 using ProgressHandler = Server::ProgressHandler;
581 using ListChangedHandler = Server::ListChangedHandler;
582 using ResourceUpdatedHandler = Server::ResourceUpdatedHandler;
583
585 JsonHandler on_completion;
587 JsonHandler on_sampling;
589 LoggingHandler on_logging;
591 RawRequestHandler on_raw_request;
593 RawNotificationHandler on_raw_notification;
595 RawRequestHandler on_custom_request;
597 RawNotificationHandler on_custom_notification;
599 ToolsListHandler on_tools_list;
601 PromptsListHandler on_prompts_list;
603 ResourcesListHandler on_resources_list;
605 ResourceTemplatesListHandler on_resource_templates_list;
607 TaskListHandler on_task_list;
609 TaskGetHandler on_task_get;
611 TaskCancelHandler on_task_cancel;
613 TaskResultHandler on_task_result;
615 ProgressHandler on_progress;
617 RootsListChangedHandler on_roots_list_changed;
619 ListChangedHandler on_tool_list_changed;
621 ListChangedHandler on_prompt_list_changed;
623 ListChangedHandler on_resource_list_changed;
625 ResourceUpdatedHandler on_resource_updated;
627 JsonContextHandler on_completion_with_context;
629 JsonContextHandler on_sampling_with_context;
631 JsonRequestContextHandler on_completion_with_request_context;
633 JsonRequestContextHandler on_sampling_with_request_context;
634
637 void apply_to(Server& server) const {
638 if (on_completion) {
640 }
641 if (on_sampling) {
643 }
644 if (on_logging) {
646 }
647 if (on_raw_request) {
649 }
652 }
653 if (on_custom_request) {
655 }
658 }
659 if (on_tools_list) {
661 }
662 if (on_prompts_list) {
664 }
665 if (on_resources_list) {
667 }
670 }
671 if (on_task_list) {
673 }
674 if (on_task_get) {
676 }
677 if (on_task_cancel) {
679 }
680 if (on_task_result) {
682 }
683 if (on_progress) {
685 }
688 }
691 }
694 }
697 }
700 }
703 }
706 }
709 }
712 }
713 }
714};
715
718inline Server& Server::set_handler(const ServerHandler& handler) {
719 handler.apply_to(*this);
720 return *this;
721}
722
725 std::shared_ptr<const ServerHandlerInterface> handler) {
726 if (!handler) {
727 throw std::invalid_argument(
728 "ServerHandlerInterface shared handler must not be null");
729 }
730
732 [handler](
733 const protocol::Json& request, const SessionContext& context,
735 const auto response =
736 handler->on_completion(request, context, cancellation);
737 if (response.has_value()) {
738 return std::move(*response);
739 }
740 return mcp::core::unexpected(handler_method_not_found(
741 "server handler does not handle completion"));
742 });
744 [handler](
745 const protocol::Json& request, const SessionContext& context,
747 const auto response =
748 handler->on_sampling(request, context, cancellation);
749 if (response.has_value()) {
750 return std::move(*response);
751 }
752 return mcp::core::unexpected(handler_method_not_found(
753 "server handler does not handle sampling"));
754 });
756 [handler](std::string_view level, std::string_view message) {
757 handler->on_logging(level, message);
758 });
759 set_raw_request_handler([handler](const protocol::JsonRpcRequest& request,
760 const SessionContext& context,
761 CancellationToken cancellation)
762 -> std::optional<protocol::JsonRpcResponse> {
763 const auto handler_response = dispatch_server_handler_request(
764 *handler, request, context, cancellation);
765 if (handler_response.has_value()) {
766 return handler_response;
767 }
768 return handler->on_custom_request(request, context);
769 });
771 [handler](const protocol::JsonRpcNotification& notification,
772 const SessionContext& context) -> core::Result<core::Unit> {
773 const auto response =
774 handler->on_raw_notification(notification, context);
775 if (response.has_value()) {
776 return std::move(*response);
777 }
778 return core::Unit{};
779 });
781 [handler](const protocol::JsonRpcNotification& notification,
782 const SessionContext& context) -> core::Result<core::Unit> {
783 const auto response =
784 handler->on_custom_notification(notification, context);
785 if (response.has_value()) {
786 return std::move(*response);
787 }
788 return core::Unit{};
789 });
790 set_task_list_handler([handler](const protocol::TaskListParams& params,
791 const SessionContext& context)
793 const auto response = handler->on_task_list(params, context);
794 if (response.has_value()) {
795 return std::move(*response);
796 }
797 return mcp::core::unexpected(
798 handler_method_not_found("server handler does not handle task list"));
799 });
801 [handler](const protocol::TaskGetParams& params,
803 const auto response = handler->on_task_get(params, context);
804 if (response.has_value()) {
805 return std::move(*response);
806 }
807 return mcp::core::unexpected(handler_method_not_found(
808 "server handler does not handle task get"));
809 });
811 [handler](const protocol::TaskCancelParams& params,
813 const auto response = handler->on_task_cancel(params, context);
814 if (response.has_value()) {
815 return std::move(*response);
816 }
817 return mcp::core::unexpected(handler_method_not_found(
818 "server handler does not handle task cancel"));
819 });
821 [handler](const protocol::TaskResultParams& params,
823 const auto response = handler->on_task_result(params, context);
824 if (response.has_value()) {
825 return std::move(*response);
826 }
827 return mcp::core::unexpected(handler_method_not_found(
828 "server handler does not handle task result"));
829 });
831 [handler](const protocol::ProgressNotificationParams& params,
832 const SessionContext& context) -> core::Result<core::Unit> {
833 const auto response = handler->on_progress(params, context);
834 if (response.has_value()) {
835 return std::move(*response);
836 }
837 return core::Unit{};
838 });
840 [handler](const SessionContext& context) -> core::Result<core::Unit> {
841 const auto response = handler->on_roots_list_changed(context);
842 if (response.has_value()) {
843 return std::move(*response);
844 }
845 return core::Unit{};
846 });
848 [handler](const SessionContext& context) -> core::Result<core::Unit> {
849 const auto response = handler->on_tool_list_changed(context);
850 if (response.has_value()) {
851 return std::move(*response);
852 }
853 return core::Unit{};
854 });
856 [handler](const SessionContext& context) -> core::Result<core::Unit> {
857 const auto response = handler->on_prompt_list_changed(context);
858 if (response.has_value()) {
859 return std::move(*response);
860 }
861 return core::Unit{};
862 });
864 [handler](const SessionContext& context) -> core::Result<core::Unit> {
865 const auto response = handler->on_resource_list_changed(context);
866 if (response.has_value()) {
867 return std::move(*response);
868 }
869 return core::Unit{};
870 });
872 [handler](const std::string& uri,
873 const SessionContext& context) -> core::Result<core::Unit> {
874 const auto response = handler->on_resource_updated(uri, context);
875 if (response.has_value()) {
876 return std::move(*response);
877 }
878 return core::Unit{};
879 });
880 return *this;
881}
882
885 return set_handler(std::shared_ptr<const ServerHandlerInterface>(
886 &handler, [](const ServerHandlerInterface*) {}));
887}
888
889} // namespace mcp::server
Copyable token observed by cancellation-aware SDK operations.
Definition cancellation.hpp:104
High-level MCP server compatibility API.
Definition server.hpp:83
void set_resource_templates_list_handler(ResourceTemplatesListHandler handler)
Registers a resources/templates/list request handler.
void set_custom_notification_handler(RawNotificationHandler handler)
Registers a custom notification handler.
void set_prompt_list_changed_handler(ListChangedHandler handler)
Registers a prompt-list-changed notification handler.
std::function< core::Result< core::Unit >(const std::string &uri, const SessionContext &)> ResourceUpdatedHandler
Handles client resource-updated notifications.
Definition server.hpp:397
void set_custom_request_handler(RawRequestHandler handler)
Registers a custom request handler.
std::function< core::Result< protocol::PromptsListResult >(const protocol::PaginatedRequestParams &, const SessionContext &)> PromptsListHandler
Handles prompts/list requests.
Definition server.hpp:359
std::function< core::Result< protocol::ResourceTemplatesListResult >(const protocol::PaginatedRequestParams &, const SessionContext &)> ResourceTemplatesListHandler
Handles resources/templates/list requests.
Definition server.hpp:369
void set_prompts_list_handler(PromptsListHandler handler)
Registers a prompts/list request handler.
void set_progress_handler(ProgressHandler handler)
Registers a progress notification handler.
void set_resource_updated_handler(ResourceUpdatedHandler handler)
Registers a resource-updated notification handler.
void set_logging_handler(LoggingHandler handler)
Registers the logging notification handler.
void set_tools_list_handler(ToolsListHandler handler)
Registers a tools/list request handler.
void set_resource_list_changed_handler(ListChangedHandler handler)
Registers a resource-list-changed notification handler.
std::function< core::Result< protocol::Task >(const protocol::TaskGetParams &, const SessionContext &)> TaskGetHandler
Handles task get requests.
Definition server.hpp:373
void set_resources_list_handler(ResourcesListHandler handler)
Registers a resources/list request handler.
void set_task_list_handler(TaskListHandler handler)
Registers a task list request handler.
std::function< core::Result< protocol::Json >(const protocol::TaskResultParams &, const SessionContext &)> TaskResultHandler
Handles task result requests.
Definition server.hpp:381
void set_raw_request_handler(RawRequestHandler handler)
Registers a raw request hook.
void set_task_cancel_handler(TaskCancelHandler handler)
Registers a task cancel request handler.
void set_raw_notification_handler(RawNotificationHandler handler)
Registers a raw notification hook.
std::function< core::Result< protocol::Task >(const protocol::TaskCancelParams &, const SessionContext &)> TaskCancelHandler
Handles task cancel requests.
Definition server.hpp:377
void set_task_get_handler(TaskGetHandler handler)
Registers a task get request handler.
std::function< std::optional< protocol::JsonRpcResponse >(const protocol::JsonRpcRequest &, const SessionContext &)> RawRequestHandler
Optionally handles raw or custom requests before built-in fallback.
Definition server.hpp:337
std::function< core::Result< protocol::Json >(const protocol::Json &)> JsonHandler
Handles JSON-shaped extension requests such as completion or sampling.
Definition server.hpp:322
std::function< core::Result< core::Unit >(const protocol::JsonRpcNotification &, const SessionContext &)> RawNotificationHandler
Handles raw or custom notifications.
Definition server.hpp:345
void set_completion_handler(JsonHandler handler)
Registers the completion request handler.
std::function< void(std::string_view, std::string_view)> LoggingHandler
Handles logging messages from clients.
Definition server.hpp:330
void set_tool_list_changed_handler(ListChangedHandler handler)
Registers a tool-list-changed notification handler.
void set_task_result_handler(TaskResultHandler handler)
Registers a task result request handler.
std::function< core::Result< core::Unit >(const SessionContext &)> RootsListChangedHandler
Handles client roots-list-changed notifications.
Definition server.hpp:385
void set_sampling_handler(JsonHandler handler)
Registers the sampling request handler.
std::function< core::Result< protocol::ResourcesListResult >(const protocol::PaginatedRequestParams &, const SessionContext &)> ResourcesListHandler
Handles resources/list requests.
Definition server.hpp:364
std::function< core::Result< core::Unit >(const SessionContext &)> ListChangedHandler
Handles client list-changed notifications.
Definition server.hpp:393
std::function< core::Result< core::Unit >(const protocol::ProgressNotificationParams &, const SessionContext &)> ProgressHandler
Handles client progress notifications.
Definition server.hpp:389
std::function< core::Result< protocol::TaskListResult >(const protocol::TaskListParams &, const SessionContext &)> TaskListHandler
Handles task list requests.
Definition server.hpp:349
std::function< core::Result< protocol::ToolsListResult >(const protocol::PaginatedRequestParams &, const SessionContext &)> ToolsListHandler
Handles tools/list requests.
Definition server.hpp:354
Server & set_handler(const ServerHandler &handler)
Installs every non-empty callback from a ServerHandler aggregate.
Definition handler.hpp:718
void set_roots_list_changed_handler(RootsListChangedHandler handler)
Registers a roots-list-changed notification handler.
nlohmann::json Json
JSON value type used by all protocol DTOs.
Definition types.hpp:28
std::monostate Unit
Success value for operations that only need to report failure.
Definition result.hpp:55
tl::expected< T, Error > Result
Alias for the SDK result type.
Definition result.hpp:64
High-level server compatibility API, builder, and convenience app API.
Structured error returned by fallible SDK operations.
Definition result.hpp:35
std::string detail
Optional extended diagnostic information.
Definition result.hpp:43
std::string message
Short human-readable explanation of the failure.
Definition result.hpp:40
int code
Numeric protocol, transport, or component-specific error code.
Definition result.hpp:37
JSON-RPC notification envelope for one-way MCP messages.
Definition types.hpp:137
JSON-RPC request envelope carrying an MCP method invocation.
Definition types.hpp:99
RequestId id
Request id that must be echoed by the response.
Definition types.hpp:105
JSON-RPC response envelope for either success or failure.
Definition types.hpp:115
Shared pagination params for MCP list requests that use cursor.
Definition types.hpp:43
Parameters for notifications/progress.
Definition types.hpp:226
Parameters for prompts/get.
Definition prompt.hpp:181
Parameters for resources/read.
Definition resource.hpp:227
Parameters for tasks/cancel.
Definition task.hpp:234
Parameters for tasks/get.
Definition task.hpp:209
Parameters for tasks/list.
Definition task.hpp:187
Parameters for tools/call.
Definition tool.hpp:335
Contract-style server handler interface.
Definition handler.hpp:26
Optional callback bundle for configuring a Server in one call.
Definition handler.hpp:564
ResourceUpdatedHandler on_resource_updated
Handles resource-updated notifications from clients.
Definition handler.hpp:625
RawRequestHandler on_raw_request
Optionally handles raw requests before built-in dispatch.
Definition handler.hpp:591
RawNotificationHandler on_custom_notification
Handles custom notifications.
Definition handler.hpp:597
LoggingHandler on_logging
Handles logging notifications.
Definition handler.hpp:589
TaskCancelHandler on_task_cancel
Handles task cancel requests.
Definition handler.hpp:611
ResourcesListHandler on_resources_list
Handles resources/list requests.
Definition handler.hpp:603
JsonContextHandler on_sampling_with_context
Handles sampling requests with session context.
Definition handler.hpp:629
JsonRequestContextHandler on_completion_with_request_context
Handles completion requests with session context and cancellation.
Definition handler.hpp:631
JsonContextHandler on_completion_with_context
Handles completion requests with session context.
Definition handler.hpp:627
ListChangedHandler on_resource_list_changed
Handles resource-list-changed notifications from clients.
Definition handler.hpp:623
RootsListChangedHandler on_roots_list_changed
Handles roots-list-changed notifications from clients.
Definition handler.hpp:617
ProgressHandler on_progress
Handles progress notifications from clients.
Definition handler.hpp:615
PromptsListHandler on_prompts_list
Handles prompts/list requests.
Definition handler.hpp:601
ToolsListHandler on_tools_list
Handles tools/list requests.
Definition handler.hpp:599
RawRequestHandler on_custom_request
Optionally handles custom requests.
Definition handler.hpp:595
TaskListHandler on_task_list
Handles task list requests.
Definition handler.hpp:607
TaskGetHandler on_task_get
Handles task get requests.
Definition handler.hpp:609
JsonHandler on_completion
Handles completion requests.
Definition handler.hpp:585
JsonRequestContextHandler on_sampling_with_request_context
Handles sampling requests with session context and cancellation.
Definition handler.hpp:633
ListChangedHandler on_prompt_list_changed
Handles prompt-list-changed notifications from clients.
Definition handler.hpp:621
ResourceTemplatesListHandler on_resource_templates_list
Handles resources/templates/list requests.
Definition handler.hpp:605
ListChangedHandler on_tool_list_changed
Handles tool-list-changed notifications from clients.
Definition handler.hpp:619
TaskResultHandler on_task_result
Handles task result requests.
Definition handler.hpp:613
void apply_to(Server &server) const
Applies all non-empty callbacks to a server.
Definition handler.hpp:637
JsonHandler on_sampling
Handles sampling requests.
Definition handler.hpp:587
RawNotificationHandler on_raw_notification
Handles raw notifications.
Definition handler.hpp:593
Per-message connection metadata supplied to server handlers.
Definition transport.hpp:42