Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@ target_include_directories(fastmcpp_core PUBLIC
# Version header is public
target_compile_definitions(fastmcpp_core PUBLIC FASTMCPP_VERSION_MAJOR=${PROJECT_VERSION_MAJOR} FASTMCPP_VERSION_MINOR=${PROJECT_VERSION_MINOR} FASTMCPP_VERSION_PATCH=${PROJECT_VERSION_PATCH})

# MSVC: avoid parallel compilation PDB contention (C1041) in large targets
if(MSVC)
target_compile_options(fastmcpp_core PRIVATE /FS)
endif()

# nlohmann_json dependency - use existing target if available (e.g., from vcpkg)
if(NOT TARGET nlohmann_json::nlohmann_json)
include(FetchContent)
Expand Down
5 changes: 5 additions & 0 deletions include/fastmcpp/client/types.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ struct ToolInfo
std::optional<std::string> description;
fastmcpp::Json inputSchema; ///< JSON Schema for tool input
std::optional<fastmcpp::Json> outputSchema; ///< JSON Schema for structured output
std::optional<fastmcpp::Json> execution; ///< Execution config (SEP-1686)
std::optional<std::vector<fastmcpp::Icon>> icons; ///< Icons for UI display
};

Expand Down Expand Up @@ -323,6 +324,8 @@ inline void to_json(fastmcpp::Json& j, const ToolInfo& t)
j["description"] = *t.description;
if (t.outputSchema)
j["outputSchema"] = *t.outputSchema;
if (t.execution)
j["execution"] = *t.execution;
if (t.icons)
j["icons"] = *t.icons;
}
Expand All @@ -337,6 +340,8 @@ inline void from_json(const fastmcpp::Json& j, ToolInfo& t)
t.inputSchema = j.value("inputSchema", fastmcpp::Json::object());
if (j.contains("outputSchema"))
t.outputSchema = j["outputSchema"];
if (j.contains("execution"))
t.execution = j["execution"];
if (j.contains("icons"))
t.icons = j["icons"].get<std::vector<fastmcpp::Icon>>();
}
Expand Down
3 changes: 2 additions & 1 deletion include/fastmcpp/prompts/prompt.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ struct Prompt
std::string name;
std::optional<std::string> description;
std::vector<PromptArgument> arguments;
std::function<std::vector<PromptMessage>(const Json&)> generator; // Message generator
std::function<std::vector<PromptMessage>(const Json&)> generator; // Message generator
fastmcpp::TaskSupport task_support{fastmcpp::TaskSupport::Forbidden}; // SEP-1686 task mode

// Legacy constructor for backwards compatibility
Prompt() = default;
Expand Down
1 change: 1 addition & 0 deletions include/fastmcpp/resources/resource.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ struct Resource
std::optional<std::string> description; // Optional description
std::optional<std::string> mime_type; // MIME type hint
std::function<ResourceContent(const Json&)> provider; // Content provider function
fastmcpp::TaskSupport task_support{fastmcpp::TaskSupport::Forbidden}; // SEP-1686 task mode

// Legacy fields (for backwards compatibility)
fastmcpp::Id id;
Expand Down
22 changes: 18 additions & 4 deletions include/fastmcpp/tools/tool.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,21 +18,24 @@ class Tool

// Original constructor (backward compatible)
Tool(std::string name, fastmcpp::Json input_schema, fastmcpp::Json output_schema, Fn fn,
std::vector<std::string> exclude_args = {})
std::vector<std::string> exclude_args = {},
fastmcpp::TaskSupport task_support = fastmcpp::TaskSupport::Forbidden)
: name_(std::move(name)), input_schema_(std::move(input_schema)),
output_schema_(std::move(output_schema)), fn_(std::move(fn)),
exclude_args_(std::move(exclude_args))
exclude_args_(std::move(exclude_args)), task_support_(task_support)
{
}

// Extended constructor with title, description, icons
Tool(std::string name, fastmcpp::Json input_schema, fastmcpp::Json output_schema, Fn fn,
std::optional<std::string> title, std::optional<std::string> description,
std::optional<std::vector<fastmcpp::Icon>> icons,
std::vector<std::string> exclude_args = {})
std::vector<std::string> exclude_args = {},
fastmcpp::TaskSupport task_support = fastmcpp::TaskSupport::Forbidden)
: name_(std::move(name)), title_(std::move(title)), description_(std::move(description)),
input_schema_(std::move(input_schema)), output_schema_(std::move(output_schema)),
icons_(std::move(icons)), fn_(std::move(fn)), exclude_args_(std::move(exclude_args))
icons_(std::move(icons)), fn_(std::move(fn)), exclude_args_(std::move(exclude_args)),
task_support_(task_support)
{
}

Expand Down Expand Up @@ -67,6 +70,11 @@ class Tool
return fn_(input);
}

fastmcpp::TaskSupport task_support() const
{
return task_support_;
}

// Setters for optional fields (builder pattern)
Tool& set_title(std::string title)
{
Expand All @@ -83,6 +91,11 @@ class Tool
icons_ = std::move(icons);
return *this;
}
Tool& set_task_support(fastmcpp::TaskSupport support)
{
task_support_ = support;
return *this;
}

private:
fastmcpp::Json prune_schema(const fastmcpp::Json& schema) const
Expand Down Expand Up @@ -126,6 +139,7 @@ class Tool
std::optional<std::vector<fastmcpp::Icon>> icons_;
Fn fn_;
std::vector<std::string> exclude_args_;
fastmcpp::TaskSupport task_support_{fastmcpp::TaskSupport::Forbidden};
};

} // namespace fastmcpp::tools
32 changes: 32 additions & 0 deletions include/fastmcpp/types.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,38 @@ namespace fastmcpp

using Json = nlohmann::json;

/// Background task execution support mode (SEP-1686).
/// Mirrors fastmcp.server.tasks.TaskConfig.mode / MCP ToolExecution.taskSupport.
enum class TaskSupport
{
Forbidden, ///< No task augmentation allowed
Optional, ///< Task augmentation supported but not required
Required ///< Task augmentation required
};

inline std::string to_string(TaskSupport support)
{
switch (support)
{
case TaskSupport::Forbidden:
return "forbidden";
case TaskSupport::Optional:
return "optional";
case TaskSupport::Required:
return "required";
}
return "forbidden";
}

inline TaskSupport task_support_from_string(const std::string& s)
{
if (s == "optional")
return TaskSupport::Optional;
if (s == "required")
return TaskSupport::Required;
return TaskSupport::Forbidden;
}

struct Id
{
std::string value;
Expand Down
6 changes: 5 additions & 1 deletion src/app.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,11 @@ std::vector<client::ToolInfo> FastMCP::list_all_tools_info() const
info.inputSchema = tool.input_schema();
info.title = tool.title();
info.description = tool.description();
info.outputSchema = tool.output_schema();
auto out_schema = tool.output_schema();
if (!out_schema.is_null())
info.outputSchema = out_schema;
if (tool.task_support() != TaskSupport::Forbidden)
info.execution = Json{{"taskSupport", to_string(tool.task_support())}};
info.icons = tool.icons();
result.push_back(info);
}
Expand Down
Loading
Loading