23#include <nlohmann/json_fwd.hpp>
90 const std::vector<std::string>& tier_names,
91 const std::string& data_dir);
137 std::string
execute(
const std::string& tool_name,
138 const std::string& args_json);
161 const std::filesystem::path&
project_dir()
const {
return project_dir_; }
179 const std::string& args_json)
const;
189 const std::string& args_json)
const;
206 const std::string& tool_name)
const;
256 const std::string& name,
257 const std::string& command =
"",
258 const std::vector<std::string>& args = {},
259 const std::string& url =
"");
307 static std::string extract_prefix(
const std::string& tool_name);
315 static std::string extract_local_name(
const std::string& tool_name);
323 static std::string args_to_pattern(
const std::string& args_json);
325 PermissionManager permissions_;
326 std::filesystem::path project_dir_;
327 std::map<std::string, std::unique_ptr<MCPServerBase>> servers_;
338 static std::string route_plugin_call(PluginServer& plugin,
339 const std::string& local_name,
340 const std::string& args_json);
350 std::string plugin_tool_schema(
const std::string& prefix,
351 const std::string& local_name)
const;
367 std::string route_external_or_unknown(
const std::string& prefix,
368 const std::string& tool_name,
369 const std::string& local_name,
370 const std::string& args_json);
378 void append_plugin_tools(nlohmann::json& all)
const;
386 void append_external_tools(nlohmann::json& all)
const;
389 std::map<std::string, std::unique_ptr<PluginServer>> plugin_servers_;
392 std::map<std::string, std::unique_ptr<ExternalMCPClient>> external_clients_;
393 std::map<std::string, ServerInfo> server_info_;
394 std::unique_ptr<HealthMonitor> health_monitor_;
395 std::unique_ptr<MCPJsonDiscovery> mcp_json_discovery_;
396 MCPConfig mcp_config_;
403 void initialize_external_servers();
413 std::string route_tool_call(
const std::string& tool_name,
414 const std::string& args_json);
426 std::string route_external_call(
427 ExternalMCPClient* client,
428 const std::string& tool_name,
429 const std::string& local_name,
430 const std::string& args_json);
442 void connect_and_register_external(
443 const std::string& name,
444 std::unique_ptr<ExternalMCPClient> client,
445 const std::string& source,
446 const std::string& url,
447 const std::string& command);
457 std::unique_ptr<ExternalMCPClient> create_external_client(
458 const std::string& name,
459 const ExternalServerEntry& entry);
468 std::unique_ptr<ExternalMCPClient> create_external_client(
469 const ExternalServerConfig& config);
485 static std::unique_ptr<Transport> make_transport(
486 const ExternalServerConfig& spec);
496 static std::string disconnected_error(
497 const std::string& tool_name,
498 const std::string& server_name);
Concrete base class for MCP servers (80% logic).
Manages MCP server instances and routes tool calls.
std::vector< std::string > connect_external_server(const ExternalServerConfig &spec)
Connect to an external MCP server at runtime (canonical spec-based API).
MCPAccessLevel get_required_access_level(const std::string &tool_name) const
Get the required access level for a tool.
bool is_explicitly_allowed(const std::string &tool_name, const std::string &args_json) const
Check if tool is explicitly allowed (skip prompting).
std::map< std::string, ServerInfo > list_server_info() const
Get snapshot of all servers with current status.
std::vector< std::string > server_names() const
List registered server names (in-process + external).
void process_health_events()
Process pending health events (call from engine loop).
MCPServerBase * get_server(const std::string &name) const
Get a registered in-process server by name.
const std::filesystem::path & project_dir() const
Get the project root directory.
std::string list_tools() const
List all tools from all connected servers.
void register_server(std::unique_ptr< MCPServerBase > server)
Register a built-in server (in-process, ownership transferred).
void add_permission(const std::string &pattern, bool allow)
Add a runtime permission pattern.
entropic_error_t load_plugins(const MCPConfig &mcp_config)
Load the dlopen plugins listed in mcp.plugins (gh#133).
bool skip_duplicate_check(const std::string &tool_name) const
Check if tool should skip duplicate detection.
void init_builtins(const MCPConfig &mcp_config, const std::vector< std::string > &tier_names, const std::string &data_dir)
Register built-in servers based on config flags.
std::string get_permission_pattern(const std::string &tool_name, const std::string &args_json) const
Generate permission pattern via server class delegation.
std::string get_tool_schema(const std::string &tool_name) const
Get the JSON Schema for a tool's input parameters.
void interrupt_external_tools()
Abort in-flight tool calls across every external MCP client.
std::string execute(const std::string &tool_name, const std::string &args_json)
Execute a tool call via the appropriate server.
void set_mcp_config(const MCPConfig &config)
Set MCP config for external server initialization.
void shutdown()
Shutdown all servers (in-process + external).
void disconnect_external_server(const std::string &name)
Disconnect and remove an external server.
void initialize()
Initialize all registered servers.
Configuration structs with defaults.
entropic_error_t
Error codes returned by all C API functions.
Client for communicating with external MCP servers.
Monitors external MCP server health and triggers reconnection.
Discovers external MCP servers from .mcp.json files.
Activate model on GPU (WARM → ACTIVE).
MCPAccessLevel
MCP tool access level for per-identity authorization.
Permission manager for MCP tool access control.
dlopen-loaded in-process MCP server plugin (gh#133).
MCPServerBase concrete base class + ServerResponse.
Parsed server entry from .mcp.json.
MCP server configuration.
Tool permission configuration.
Runtime state of a connected MCP server.
std::string url
SSE URL (empty otherwise)
std::string transport
"stdio" | "sse" | "in_process"
std::string source
"builtin" | "config" | "mcp_json" | "runtime"
std::vector< std::string > tools
Registered tool names (prefixed)
std::string name
Server name (unique key)
std::string command
Stdio command (empty otherwise)
int reconnect_attempts
Current reconnect attempt count.
std::chrono::system_clock::time_point connected_at
Connection timestamp.
std::string status
"connected" | "disconnected" | "error" | "reconnecting"