11#include <nlohmann/json.hpp>
26 std::lock_guard<std::mutex> lock(key_mutex_);
27 keys_[pattern] = level;
28 logger->info(
"Granted {}:{}", pattern,
40 std::lock_guard<std::mutex> lock(key_mutex_);
41 auto it = keys_.find(pattern);
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);
70 return static_cast<uint8_t
>(granted) >=
71 static_cast<uint8_t
>(required);
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_) {
85 result.push_back(
MCPKey{pattern, level});
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_) {
122 {
"pattern", pattern},
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).
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.