11#include <nlohmann/json.hpp>
26 std::lock_guard<std::mutex> lock(key_mutex_);
28 logger->info(
"Granted {}:{}",
pattern,
40 std::lock_guard<std::mutex> lock(key_mutex_);
42 if (
it == keys_.end()) {
46 logger->info(
"Revoked {}",
pattern);
68 std::lock_guard<std::mutex> lock(key_mutex_);
69 auto granted = find_best_match(tool_name);
81 std::lock_guard<std::mutex> lock(key_mutex_);
82 std::vector<MCPKey> result;
83 result.reserve(keys_.size());
84 for (
const auto& [
pattern, level] : keys_) {
97 std::lock_guard<std::mutex> lock(key_mutex_);
107 std::lock_guard<std::mutex> lock(key_mutex_);
118 std::lock_guard<std::mutex> lock(key_mutex_);
119 nlohmann::json arr = nlohmann::json::array();
120 for (
const auto& [
pattern, level] : keys_) {
139 arr = nlohmann::json::parse(json);
140 }
catch (
const nlohmann::json::exception&
e) {
141 logger->warn(
"Deserialize failed: {}",
e.what());
144 if (!arr.is_array()) {
145 logger->warn(
"Deserialize: expected JSON array");
148 std::lock_guard<std::mutex> lock(key_mutex_);
150 for (
const auto& entry : arr) {
151 if (!entry.contains(
"pattern") || !entry.contains(
"level")) {
152 logger->warn(
"Skipping entry: missing fields");
156 auto level_str = entry[
"level"].get<std::string>();
158 logger->warn(
"Skipping entry: unknown level '{}'",
162 keys_[entry[
"pattern"].get<std::string>()] = level;
176std::string MCPKeySet::server_wildcard(
177 const std::string& tool_name) {
178 auto dot = tool_name.find(
'.');
179 if (
dot == std::string::npos) {
182 return tool_name.substr(0,
dot) +
".*";
199 const std::string& tool_name)
const {
202 auto it = keys_.find(tool_name);
203 if (
it != keys_.end()) {
205 }
else if (
auto wc = server_wildcard(tool_name);
207 (
it = keys_.find(
wc)) != keys_.end()) {
210 }
else if ((
it = keys_.find(
"*")) != keys_.end()) {
bool has_access(const std::string &tool_name, MCPAccessLevel required) const
Check if a specific tool is authorized at the required level.
void clear()
Remove all granted keys.
bool revoke(const std::string &pattern)
Revoke a tool key entirely.
bool deserialize(const std::string &json)
Deserialize key set from JSON string.
std::string serialize() const
Serialize key set to JSON string.
std::vector< MCPKey > list() const
List all granted keys.
size_t size() const
Number of granted keys.
void grant(const std::string &pattern, MCPAccessLevel level)
Grant a tool key with an access level.
spdlog initialization and logger access.
ENTROPIC_EXPORT std::shared_ptr< spdlog::logger > get(const std::string &name)
Get or create a named logger.
Per-identity set of authorized MCP tool keys.
Activate model on GPU (WARM → ACTIVE).
@ optional
optional: every escape asks the host's path approver
const char * mcp_access_level_name(MCPAccessLevel level)
Convert MCPAccessLevel to string representation.
MCPAccessLevel
MCP tool access level for per-identity authorization.
@ NONE
No access (default for ungranted keys)
bool parse_mcp_access_level(const std::string &name, MCPAccessLevel &out)
Parse MCPAccessLevel from string.
A single authorized MCP key with access level.