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);
60 std::lock_guard<std::mutex> lock(key_mutex_);
61 auto granted = find_best_match(tool_name);
62 return static_cast<uint8_t
>(granted) >=
63 static_cast<uint8_t
>(required);
73 std::lock_guard<std::mutex> lock(key_mutex_);
74 std::vector<MCPKey> result;
75 result.reserve(keys_.size());
76 for (
const auto& [pattern, level] : keys_) {
77 result.push_back(
MCPKey{pattern, level});
89 std::lock_guard<std::mutex> lock(key_mutex_);
99 std::lock_guard<std::mutex> lock(key_mutex_);
110 std::lock_guard<std::mutex> lock(key_mutex_);
111 nlohmann::json arr = nlohmann::json::array();
112 for (
const auto& [pattern, level] : keys_) {
114 {
"pattern", pattern},
131 arr = nlohmann::json::parse(json);
132 }
catch (
const nlohmann::json::exception& e) {
133 logger->warn(
"Deserialize failed: {}", e.what());
136 if (!arr.is_array()) {
137 logger->warn(
"Deserialize: expected JSON array");
140 std::lock_guard<std::mutex> lock(key_mutex_);
142 for (
const auto& entry : arr) {
143 if (!entry.contains(
"pattern") || !entry.contains(
"level")) {
144 logger->warn(
"Skipping entry: missing fields");
148 auto level_str = entry[
"level"].get<std::string>();
150 logger->warn(
"Skipping entry: unknown level '{}'",
154 keys_[entry[
"pattern"].get<std::string>()] = level;
168std::string MCPKeySet::server_wildcard(
169 const std::string& tool_name) {
170 auto dot = tool_name.find(
'.');
171 if (dot == std::string::npos) {
174 return tool_name.substr(0, dot) +
".*";
185 const std::string& tool_name)
const {
188 auto it = keys_.find(tool_name);
189 if (it != keys_.end()) {
191 }
else if (
auto wc = server_wildcard(tool_name);
193 (it = keys_.find(wc)) != keys_.end()) {
196 }
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.