manage_kv
InactiveTool of io.github.butterbase-ai/mcp
Manage app KV store: config rules (expose/unexpose namespaces) and data-plane operations (get/set/del/incr etc). Actions — Config: - "list_rules": List all KV namespace exposure rules for the app - "expose": Expose a key pattern with read/write role access control - "unexpose": Remove an exposure rule by pattern - "stats": Get KV usage stats (key count, memory, etc.) - "scan": Scan keys by prefix (cursor-based, params: prefix, limit, cursor) - "flush": Delete ALL keys in the KV store (requires confirm: true; include_config?: true also wipes rules) Actions — Data plane: - "get": Get the value of a key (opts: raw?, touch?) - "set": Set a key to a value (opts: ttl?, ephemeral?, raw?) - "del": Delete one key - "incr": Increment a key's integer value (opts: by?) - "decr": Decrement a key's integer value (opts: by?) - "setnx": Set a key only if it does not already exist (opts: value, ttl?) - "setex": Set a key with an explicit TTL in seconds (same as set + ttl) - "cas": Compare-and-swap: atomically set next only if current value matches expected - "exists": Check if a key exists - "ttl": Get remaining TTL of a key in seconds - "expire": Set a TTL on an existing key - "mget": Get values of multiple keys at once (uses batch op) - "mset": Set multiple key-value pairs at once (uses batch op; entries: {key: value}) Parameters by action: list_rules: { app_id, action: "list_rules" } expose: { app_id, action: "expose", pattern, read, write } unexpose: { app_id, action: "unexpose", pattern } stats: { app_id, action: "stats" } scan: { app_id, action: "scan", prefix?, limit?, cursor? } flush: { app_id, action: "flush", confirm: true, include_config? } get: { app_id, action: "get", key, raw?, touch? } set: { app_id, action: "set", key, value, ttl?, ephemeral?, raw? } del: { app_id, action: "del", key } incr: { app_id, action: "incr", key, by? } decr: { app_id, action: "decr", key, by? } setnx: { app_id, action: "setnx", key, value, ttl? } setex: { app_id, action: "setex", key, value, ttl } cas: { app_id, action: "cas", key, expected, next } exists: { app_id, action: "exists", key } ttl: { app_id, action: "ttl", key } expire: { app_id, action: "expire", key, ttl } mget: { app_id, action: "mget", keys } mset: { app_id, action: "mset", entries } Warning: "flush" deletes ALL keys and cannot be undone. Always pass confirm: true explicitly.
Parameters schema
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"app_id",
"action"
],
"properties": {
"by": {
"type": "number",
"description": "Amount to increment/decrement (default 1, for incr/decr)"
},
"key": {
"type": "string",
"description": "The KV key for single-key data-plane actions"
},
"raw": {
"type": "boolean",
"description": "Store/retrieve raw string without JSON wrapping (for set/get)"
},
"ttl": {
"type": [
"number",
"null"
],
"description": "TTL in seconds (null = no expiry; for set, setex, expire, setnx)"
},
"keys": {
"type": "array",
"items": {
"type": "string"
},
"description": "Array of keys for mget"
},
"next": {
"description": "The next value to set for CAS if expected matches"
},
"read": {
"enum": [
"public",
"authed",
"owner",
"deny"
],
"type": "string",
"description": "Read access role for expose"
},
"limit": {
"type": "integer",
"maximum": 1000,
"description": "Max keys to return per scan page (max 1000)",
"exclusiveMinimum": 0
},
"touch": {
"type": "boolean",
"description": "Reset TTL to original on read (for get)"
},
"value": {
"description": "The value to set — can be any JSON (object, array, string, number)"
},
"write": {
"enum": [
"public",
"authed",
"owner",
"deny"
],
"type": "string",
"description": "Write access role for expose"
},
"action": {
"enum": [
"list_rules",
"expose",
"unexpose",
"stats",
"scan",
"flush",
"get",
"set",
"del",
"incr",
"decr",
"setnx",
"setex",
"cas",
"exists",
"ttl",
"expire",
"mget",
"mset"
],
"type": "string",
"description": "The action to perform"
},
"app_id": {
"type": "string",
"description": "The app ID (e.g. app_abc123def456)"
},
"cursor": {
"type": "string",
"description": "Pagination cursor for scan (omit for first page)"
},
"prefix": {
"type": "string",
"description": "Key prefix for scan (e.g. \"user:\")"
},
"confirm": {
"type": "boolean",
"description": "Must be true to execute flush"
},
"entries": {
"type": "object",
"description": "Object of key→value pairs for mset (values can be any JSON)",
"additionalProperties": {}
},
"pattern": {
"type": "string",
"description": "Key pattern for expose/unexpose (e.g. \"user:*\")"
},
"expected": {
"description": "The expected current value for CAS (compare-and-swap)"
},
"ephemeral": {
"type": "boolean",
"description": "Store in ephemeral DB (shorter-lived, for set/setnx)"
},
"include_config": {
"type": "boolean",
"description": "Also wipe exposure rules when flushing (use with flush)"
}
},
"additionalProperties": false
}No endpoints wrapped at confidence ≥ 0.70.
Parent server
io.github.butterbase-ai/mcp
https://github.com/butterbase-ai/butterbase-oss
1/7 registries