Entropic 2.11.1
Local-first agentic inference engine
Loading...
Searching...
No Matches
server_manager.h
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
13#pragma once
14
22
23#include <nlohmann/json_fwd.hpp>
24
25#include <chrono>
26#include <filesystem>
27#include <map>
28#include <memory>
29#include <string>
30#include <vector>
31
32namespace entropic {
33
38struct ServerInfo {
39 std::string name;
40 std::string transport;
41 std::string url;
42 std::string command;
43 std::string status;
44 std::vector<std::string> tools;
45 std::string source;
46 std::chrono::system_clock::time_point connected_at;
48};
49
60public:
67 ServerManager(const PermissionsConfig& permissions,
68 const std::filesystem::path& project_dir);
69
75 void register_server(std::unique_ptr<MCPServerBase> server);
76
89 void init_builtins(const MCPConfig& mcp_config,
90 const std::vector<std::string>& tier_names,
91 const std::string& data_dir);
92
112 entropic_error_t load_plugins(const MCPConfig& mcp_config);
113
118 void initialize();
119
125 std::string list_tools() const;
126
137 std::string execute(const std::string& tool_name,
138 const std::string& args_json);
139
146 MCPServerBase* get_server(const std::string& name) const;
147
153 std::vector<std::string> server_names() const;
154
161 const std::filesystem::path& project_dir() const { return project_dir_; }
162
169 std::string get_tool_schema(const std::string& tool_name) const;
170
178 bool is_explicitly_allowed(const std::string& tool_name,
179 const std::string& args_json) const;
180
188 std::string get_permission_pattern(const std::string& tool_name,
189 const std::string& args_json) const;
190
197 bool skip_duplicate_check(const std::string& tool_name) const;
198
206 const std::string& tool_name) const;
207
214 void add_permission(const std::string& pattern, bool allow);
215
220 void shutdown();
221
222 /* ── v1.8.7: External server methods ───────────────── */
223
237 std::vector<std::string> connect_external_server(
238 const ExternalServerConfig& spec);
239
255 std::vector<std::string> connect_external_server(
256 const std::string& name,
257 const std::string& command = "",
258 const std::vector<std::string>& args = {},
259 const std::string& url = "");
260
266 void disconnect_external_server(const std::string& name);
267
273 std::map<std::string, ServerInfo> list_server_info() const;
274
280
286 void set_mcp_config(const MCPConfig& config);
287
299
300private:
307 static std::string extract_prefix(const std::string& tool_name);
308
315 static std::string extract_local_name(const std::string& tool_name);
316
323 static std::string args_to_pattern(const std::string& args_json);
324
325 PermissionManager permissions_;
326 std::filesystem::path project_dir_;
327 std::map<std::string, std::unique_ptr<MCPServerBase>> servers_;
328
338 static std::string route_plugin_call(PluginServer& plugin,
339 const std::string& local_name,
340 const std::string& args_json);
341
350 std::string plugin_tool_schema(const std::string& prefix,
351 const std::string& local_name) const;
352
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);
371
378 void append_plugin_tools(nlohmann::json& all) const;
379
386 void append_external_tools(nlohmann::json& all) const;
387
388 /* ── gh#133 (v2.10.1): dlopen plugin state ─────────── */
389 std::map<std::string, std::unique_ptr<PluginServer>> plugin_servers_;
390
391 /* ── v1.8.7: External server state ─────────────────── */
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_;
397
403 void initialize_external_servers();
404
413 std::string route_tool_call(const std::string& tool_name,
414 const std::string& args_json);
415
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);
431
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);
448
457 std::unique_ptr<ExternalMCPClient> create_external_client(
458 const std::string& name,
459 const ExternalServerEntry& entry);
460
468 std::unique_ptr<ExternalMCPClient> create_external_client(
469 const ExternalServerConfig& config);
470
485 static std::unique_ptr<Transport> make_transport(
486 const ExternalServerConfig& spec);
487
496 static std::string disconnected_error(
497 const std::string& tool_name,
498 const std::string& server_name);
499};
500
501} // namespace entropic
Concrete base class for MCP servers (80% logic).
Definition server_base.h:66
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.
Definition error.h:37
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.
Definition config.h:38
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.
Definition config.h:678
Tool permission configuration.
Definition config.h:619
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"