44#include " fastmcpp/client/types.hpp"
55#include " fastmcpp/exceptions.hpp"
66#include " fastmcpp/mcp/handler.hpp"
7+ #include " fastmcpp/resources/template.hpp"
8+ #include " fastmcpp/util/schema_build.hpp"
79
810#include < unordered_set>
911
@@ -16,7 +18,125 @@ FastMCP::FastMCP(std::string name, std::string version, std::optional<std::strin
1618{
1719}
1820
19- void FastMCP::mount (FastMCP& app, const std::string& prefix, bool as_proxy)
21+ namespace
22+ {
23+ fastmcpp::Json schema_from_schema_or_simple (const fastmcpp::Json& schema_or_simple)
24+ {
25+ return fastmcpp::util::schema_build::to_object_schema_from_simple (schema_or_simple);
26+ }
27+
28+ fastmcpp::Json build_resource_template_parameters_schema (const std::string& uri_template)
29+ {
30+ const auto path_params = fastmcpp::resources::extract_path_params (uri_template);
31+ const auto query_params = fastmcpp::resources::extract_query_params (uri_template);
32+
33+ fastmcpp::Json properties = fastmcpp::Json::object ();
34+ fastmcpp::Json required = fastmcpp::Json::array ();
35+
36+ for (const auto & p : path_params)
37+ {
38+ properties[p] = fastmcpp::Json{{" type" , " string" }};
39+ required.push_back (p);
40+ }
41+ for (const auto & p : query_params)
42+ properties[p] = fastmcpp::Json{{" type" , " string" }};
43+
44+ return fastmcpp::Json{
45+ {" type" , " object" },
46+ {" properties" , properties},
47+ {" required" , required},
48+ };
49+ }
50+ } // namespace
51+
52+ FastMCP& FastMCP::tool (std::string name, const Json& input_schema_or_simple, tools::Tool::Fn fn,
53+ ToolOptions options)
54+ {
55+ auto input_schema = schema_from_schema_or_simple (input_schema_or_simple);
56+
57+ tools::Tool t{std::move (name),
58+ std::move (input_schema),
59+ std::move (options.output_schema ),
60+ std::move (fn),
61+ std::move (options.title ),
62+ std::move (options.description ),
63+ std::move (options.icons ),
64+ std::move (options.exclude_args ),
65+ options.task_support };
66+
67+ tools_.register_tool (t);
68+ return *this ;
69+ }
70+
71+ FastMCP& FastMCP::tool (std::string name, tools::Tool::Fn fn, ToolOptions options)
72+ {
73+ return tool (std::move (name), Json::object (), std::move (fn), std::move (options));
74+ }
75+
76+ FastMCP& FastMCP::prompt (std::string name,
77+ std::function<std::vector<prompts::PromptMessage>(const Json&)> generator,
78+ PromptOptions options)
79+ {
80+ prompts::Prompt p;
81+ p.name = std::move (name);
82+ p.description = std::move (options.description );
83+ p.meta = std::move (options.meta );
84+ p.arguments = std::move (options.arguments );
85+ p.generator = std::move (generator);
86+ p.task_support = options.task_support ;
87+ prompts_.register_prompt (p);
88+ return *this ;
89+ }
90+
91+ FastMCP& FastMCP::prompt_template (std::string name, std::string template_string, PromptOptions options)
92+ {
93+ prompts::Prompt p{std::move (template_string)};
94+ p.name = std::move (name);
95+ p.description = std::move (options.description );
96+ p.meta = std::move (options.meta );
97+ p.arguments = std::move (options.arguments );
98+ p.task_support = options.task_support ;
99+ prompts_.register_prompt (p);
100+ return *this ;
101+ }
102+
103+ FastMCP& FastMCP::resource (std::string uri, std::string name,
104+ std::function<resources::ResourceContent(const Json&)> provider,
105+ ResourceOptions options)
106+ {
107+ resources::Resource r;
108+ r.uri = std::move (uri);
109+ r.name = std::move (name);
110+ r.description = std::move (options.description );
111+ r.mime_type = std::move (options.mime_type );
112+ r.provider = std::move (provider);
113+ r.task_support = options.task_support ;
114+ resources_.register_resource (r);
115+ return *this ;
116+ }
117+
118+ FastMCP& FastMCP::resource_template (
119+ std::string uri_template, std::string name,
120+ std::function<resources::ResourceContent(const Json& params)> provider,
121+ const Json& parameters_schema_or_simple, ResourceTemplateOptions options)
122+ {
123+ resources::ResourceTemplate templ;
124+ templ.uri_template = std::move (uri_template);
125+ templ.name = std::move (name);
126+ templ.description = std::move (options.description );
127+ templ.mime_type = std::move (options.mime_type );
128+ templ.provider = std::move (provider);
129+
130+ if (parameters_schema_or_simple.is_object () && parameters_schema_or_simple.empty ())
131+ templ.parameters = build_resource_template_parameters_schema (templ.uri_template );
132+ else
133+ templ.parameters = schema_from_schema_or_simple (parameters_schema_or_simple);
134+
135+ resources_.register_template (std::move (templ));
136+ return *this ;
137+ }
138+
139+ void FastMCP::mount (FastMCP& app, const std::string& prefix, bool as_proxy)
20140{
21141 mount (app, prefix, as_proxy, std::nullopt );
22142}
0 commit comments