74 const char* name,
const nlohmann::json& j) {
77 spec.
command = j.value(
"command",
"");
78 spec.
url = j.value(
"url",
"");
80 spec.
url.empty() ?
"stdio" :
"sse");
81 if (j.contains(
"args") && j[
"args"].is_array()) {
82 spec.
args = j[
"args"].get<std::vector<std::string>>();
84 if (j.contains(
"env") && j[
"env"].is_object()) {
85 for (
auto& [key, val] : j[
"env"].items()) {
87 logger->warn(
"register_mcp_server '{}': blocked env var "
88 "'{}' — skipping", name, key);
91 if (val.is_string()) {
92 spec.
env[key] = val.get<std::string>();
108 const char* config_json) {
116 auto j = nlohmann::json::parse(config_json);
119 logger->info(
"register_mcp_server: name='{}' env_keys={}",
120 name, spec.env.size());
122 }
catch (
const std::exception& e) {
149 logger->info(
"deregister_mcp_server: name='{}'", name);
151 }
catch (
const std::exception& e) {
165extern "C" ENTROPIC_EXPORT
char*
171 nlohmann::json arr = nlohmann::json::array();
174 for (
const auto& [name, s] : servers) {
175 arr.push_back({{
"name", s.name},
176 {
"transport", s.transport},
177 {
"status", s.status},
178 {
"source", s.source}});
181 return strdup(arr.dump().c_str());
182 }
catch (
const std::exception& e) {
Private definition of the entropic_engine struct.
Public C API for the Entropic inference engine.
ENTROPIC_EXPORT entropic_error_t entropic_register_mcp_server(entropic_handle_t handle, const char *name, const char *config_json)
Register an external MCP server from JSON config (C ABI).
static entropic::ExternalServerConfig parse_external_server_spec(const char *name, const nlohmann::json &j)
Register an external MCP server at runtime.
static entropic_error_t check_server_mgr(entropic_handle_t h)
Check handle prerequisites for MCP server APIs.
ENTROPIC_EXPORT char * entropic_list_mcp_servers(entropic_handle_t handle)
List all MCP servers as JSON array.
ENTROPIC_EXPORT entropic_error_t entropic_deregister_mcp_server(entropic_handle_t handle, const char *name)
Deregister an external MCP server.
entropic_error_t
Error codes returned by all C API functions.
@ ENTROPIC_ERROR_SERVER_NOT_FOUND
MCP server name not found (v1.8.7)
@ ENTROPIC_ERROR_CONNECTION_FAILED
Transport connection failed (v1.8.7)
@ ENTROPIC_ERROR_INVALID_ARGUMENT
NULL pointer, empty string, out-of-range value.
@ ENTROPIC_ERROR_INVALID_HANDLE
NULL or destroyed handle (v1.8.9)
@ ENTROPIC_ERROR_INVALID_STATE
Operation not valid in current state (e.g., generate before activate)
JSON serialization helpers for the facade.
spdlog initialization and logger access.
ENTROPIC_EXPORT std::shared_ptr< spdlog::logger > get(const std::string &name)
Get or create a named logger.
Discovers external MCP servers from .mcp.json files.
bool is_blocked_env_var(const std::string &key)
Environment variable blocklist for .mcp.json env field.
Parsed server entry from .mcp.json.
std::string name
Server name.
std::map< std::string, std::string > env
Stdio env vars.
std::string command
Stdio command (empty for SSE)
std::string transport
"stdio" | "sse"
std::vector< std::string > args
Stdio command args.
std::string url
SSE URL (empty for stdio)
Engine handle struct — owns all subsystems.
std::atomic< bool > configured
True after configure()
std::string last_error
Per-handle error message.
std::unique_ptr< entropic::ServerManager > server_manager
MCP server lifecycle.