Entropic 2.11.1
Local-first agentic inference engine
Loading...
Searching...
No Matches
entropic_mcp.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
12#include "engine_handle.h"
13
14#include <entropic/entropic.h>
17
18#include "json_serializers.h"
19
20#include <cstring>
21
22static auto logger = entropic::log::get("facade.mcp");
23
36
74 const char* name, const nlohmann::json& j) {
76 spec.name = name;
77 spec.command = j.value("command", "");
78 spec.url = j.value("url", "");
79 spec.transport = j.value("transport",
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>>();
83 }
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);
89 continue;
90 }
91 if (val.is_string()) {
92 spec.env[key] = val.get<std::string>();
93 }
94 }
95 }
96 return spec;
97}
98
110extern "C" ENTROPIC_EXPORT entropic_error_t
112 entropic_handle_t handle,
113 const char* name,
114 const char* config_json) {
115
116 auto rc = check_server_mgr(handle);
117 if (rc != ENTROPIC_OK || !name || !config_json) {
119 }
120
121 try {
122 auto j = nlohmann::json::parse(config_json);
123 auto spec = parse_external_server_spec(name, j);
124 handle->server_manager->connect_external_server(spec);
125 logger->info("register_mcp_server: name='{}' env_keys={}",
126 name, spec.env.size());
127 return ENTROPIC_OK;
128 } catch (const std::exception& e) {
129 handle->last_error = e.what();
131 }
132}
133
145extern "C" ENTROPIC_EXPORT entropic_error_t
147 entropic_handle_t handle,
148 const char* name) {
149
150 auto rc = check_server_mgr(handle);
151 if (rc != ENTROPIC_OK || !name) {
153 }
154
155 try {
156 handle->server_manager->disconnect_external_server(name);
157 logger->info("deregister_mcp_server: name='{}'", name);
158 return ENTROPIC_OK;
159 } catch (const std::exception& e) {
160 handle->last_error = e.what();
162 }
163}
164
176extern "C" ENTROPIC_EXPORT char*
178 if (!handle || !handle->configured.load()) {
179 return nullptr;
180 }
181 try {
182 nlohmann::json arr = nlohmann::json::array();
183 if (handle->server_manager) {
184 auto servers = handle->server_manager->list_server_info();
185 for (const auto& [name, s] : servers) {
186 arr.push_back({{"name", s.name},
187 {"transport", s.transport},
188 {"status", s.status},
189 {"source", s.source}});
190 }
191 }
192 return strdup(arr.dump().c_str());
193 } catch (const std::exception& e) {
194 handle->last_error = e.what();
195 return nullptr;
196 }
197}
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.
Definition error.h:37
@ ENTROPIC_OK
Success.
Definition error.h:38
@ ENTROPIC_ERROR_SERVER_NOT_FOUND
MCP server name not found (v1.8.7)
Definition error.h:55
@ ENTROPIC_ERROR_CONNECTION_FAILED
Transport connection failed (v1.8.7)
Definition error.h:56
@ ENTROPIC_ERROR_INVALID_ARGUMENT
NULL pointer, empty string, out-of-range value.
Definition error.h:39
@ ENTROPIC_ERROR_INVALID_HANDLE
NULL or destroyed handle (v1.8.9)
Definition error.h:57
@ ENTROPIC_ERROR_INVALID_STATE
Operation not valid in current state (e.g., generate before activate)
Definition error.h:41
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.
Definition logging.cpp:211
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::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.