CCM
/MCP
SkillsMCPMarketplacesDigestToolsAdvertise

This week in Claude

Every Monday: Claude Code, Agent SDK, MCP, and the Anthropic platform moves worth your time.

Skills by Category
Frontend DevelopmentBackend & APIsTesting & QASecurityDevOps & CI/CDGit & Pull RequestsDocumentationCode Review & QualityAI & Agent BuildingSkill Development
MCP Servers by Category
Sales & MarketingWeb & Browser AutomationDatabasesAI & LLM ToolsCloud & InfrastructureCommunication & MessagingDeveloper ToolsDesign & CreativeDocuments & KnowledgeSearch & Web Crawling
Marketplaces by Category
AI Agents & OrchestrationLLM IntegrationDevelopment ToolsFrontend & UIBackend & APIsDatabasesTesting & Code QualityDevOps & CloudSecurity & ComplianceGit & Version Control

Claude Code Marketplaces

Discover Claude Code plugins, extensions, and tools. Automatically updated directory of Anthropic Claude AI marketplaces with development tools, productivity plugins, and integrations.

Resources

  • Browse Skills
  • Browse MCP Servers
  • Browse Marketplaces
  • Skill index
  • MCP index
  • Marketplace index
  • Plugins Reference

Community

  • About
  • Tools
  • Feedback
  • Privacy Policy
  • Advertise

Built for the Claude Code community with Claude Code by mertbuilds.com

Independent project, not affiliated with Anthropic
betterdb-inc avatar

Monitor

betterdb-inc/monitor
1.1k41 toolsauthSTDIOregistry active
Summary

Connects Claude to a running Valkey or Redis instance and surfaces real time observability data through MCP tools. You get memory stats, client connections, keyspace metrics, slow queries, and cluster health without leaving your editor. Built on top of BetterDB's monitoring stack, which they also ship as a standalone web dashboard and CLI. Useful when you're debugging cache behavior, investigating performance issues, or need to check database state while writing code that hits Redis. The same company ships semantic caching libraries for LLMs, so the MCP integration feels like a natural extension of that tooling.

Install to Claude Code

verified
claude mcp add monitor --env BETTERDB_URL=YOUR_BETTERDB_URL --env BETTERDB_TOKEN=YOUR_BETTERDB_TOKEN --env BETTERDB_INSTANCE_ID=YOUR_BETTERDB_INSTANCE_ID -- npx -y @betterdb/mcp

Run in your terminal. Replace YOUR_* placeholders with real values; add --scope user to install for every project.

Review the command, arguments, and environment values before installing — MCP servers run with your local permissions.

CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
inference shell
inference shell
create and run specialised agents in minutes
build now →
MCP-ready Email SendingMCP-ready Email Sending
MCP-ready Email Sending
Plug Mailtrap into your AI workflow and let it handle the email.
Connect Mailtrap MCP →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Capacitor - Shared memory for your team’s coding agents.
Capacitor - Shared memory for your team’s coding agents.
Make coding agent sessions - Searchable, Shareable, Vendor-neutral & Scored.
Try For Free →
CodeScene MCP ServerCodeScene MCP Server
CodeScene MCP Server
Your agent targets a perfect 10 Code Health score. Deterministic. Every commit.
Try For Free →
Give your AI the whole web as clean markdownGive your AI the whole web as clean markdown
Give your AI the whole web as clean markdown
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
belt - the only tool your agent needs
belt - the only tool your agent needs
belt cli automatically finds the best tools and skills for your agent. image, video, music, tts...
one prompt install →
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
inference shell
inference shell
create and run specialised agents in minutes
build now →
MCP-ready Email SendingMCP-ready Email Sending
MCP-ready Email Sending
Plug Mailtrap into your AI workflow and let it handle the email.
Connect Mailtrap MCP →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Capacitor - Shared memory for your team’s coding agents.
Capacitor - Shared memory for your team’s coding agents.
Make coding agent sessions - Searchable, Shareable, Vendor-neutral & Scored.
Try For Free →
CodeScene MCP ServerCodeScene MCP Server
CodeScene MCP Server
Your agent targets a perfect 10 Code Health score. Deterministic. Every commit.
Try For Free →
Give your AI the whole web as clean markdownGive your AI the whole web as clean markdown
Give your AI the whole web as clean markdown
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
belt - the only tool your agent needs
belt - the only tool your agent needs
belt cli automatically finds the best tools and skills for your agent. image, video, music, tts...
one prompt install →

Tools

Verified live against the running server on Jun 10, 2026.

verified live41 tools
list_instancesList all Valkey/Redis instances registered in BetterDB. Shows connection status and capabilities.

List all Valkey/Redis instances registered in BetterDB. Shows connection status and capabilities.

No parameters — call it with no arguments.

select_instanceSelect which instance subsequent tool calls operate on.1 params

Select which instance subsequent tool calls operate on.

Parameters* required
instanceId*string
The instance ID to select
add_connectionAdd a new Valkey/Redis connection to BetterDB. Optionally set it as the active default.6 params

Add a new Valkey/Redis connection to BetterDB. Optionally set it as the active default.

Parameters* required
host*string
Hostname or IP address
name*string
Display name for the connection
passwordstring
Auth password
portinteger
Port numberdefault: 6379
setAsDefaultboolean
Set this connection as the active default
usernamestring
ACL username (default: "default")
test_connectionTest a Valkey/Redis connection without persisting it. Use before add_connection to validate credentials.5 params

Test a Valkey/Redis connection without persisting it. Use before add_connection to validate credentials.

Parameters* required
host*string
Hostname or IP address
name*string
Display name for the connection
passwordstring
Auth password
portinteger
Port numberdefault: 6379
usernamestring
ACL username (default: "default")
remove_connectionRemove a connection from BetterDB.1 params

Remove a connection from BetterDB.

Parameters* required
instanceId*string
The instance ID to remove
set_default_connectionSet a connection as the active default for BetterDB.1 params

Set a connection as the active default for BetterDB.

Parameters* required
instanceId*string
The instance ID to set as default
get_infoGet INFO stats for the active instance. Contains all health data: memory, clients, replication, keyspace, stats (hit rate, ops/sec), and server info. Optionally filter to a section: server|clients|memory|stats|replication|keyspace.2 params

Get INFO stats for the active instance. Contains all health data: memory, clients, replication, keyspace, stats (hit rate, ops/sec), and server info. Optionally filter to a section: server|clients|memory|stats|replication|keyspace.

Parameters* required
instanceIdstring
Optional instance ID override
sectionstring
INFO section to filter (server, clients, memory, stats, replication, keyspace)
get_slowlogGet the most recent slow commands from the slowlog.2 params

Get the most recent slow commands from the slowlog.

Parameters* required
countnumber
Number of entries to return (default 25)
instanceIdstring
Optional instance ID override
get_commandlogGet the most recent entries from COMMANDLOG (Valkey 8+ only, superset of slowlog).2 params

Get the most recent entries from COMMANDLOG (Valkey 8+ only, superset of slowlog).

Parameters* required
countnumber
Number of entries to return (default 25)
instanceIdstring
Optional instance ID override
get_latencyGet latency event history for the active instance.1 params

Get latency event history for the active instance.

Parameters* required
instanceIdstring
Optional instance ID override
get_memoryGet memory diagnostics: MEMORY DOCTOR assessment and MEMORY STATS breakdown.1 params

Get memory diagnostics: MEMORY DOCTOR assessment and MEMORY STATS breakdown.

Parameters* required
instanceIdstring
Optional instance ID override
get_clientsGet the active client list with connection details.1 params

Get the active client list with connection details.

Parameters* required
instanceIdstring
Optional instance ID override
get_healthGet a synthetic health summary for the active instance: keyspace hit rate, memory fragmentation ratio, connected clients, replication lag (replicas only), and keyspace size. Use this as the first call when investigating an instance — it surfaces the most actionable signals wit...1 params

Get a synthetic health summary for the active instance: keyspace hit rate, memory fragmentation ratio, connected clients, replication lag (replicas only), and keyspace size. Use this as the first call when investigating an instance — it surfaces the most actionable signals wit...

Parameters* required
instanceIdstring
Optional instance ID override
get_slowlog_patternsGet analyzed slowlog patterns from persisted storage. Groups slow commands by normalized pattern, showing frequency, average duration, and example commands. Survives slowlog buffer rotation — data goes back as far as BetterDB has been running.2 params

Get analyzed slowlog patterns from persisted storage. Groups slow commands by normalized pattern, showing frequency, average duration, and example commands. Survives slowlog buffer rotation — data goes back as far as BetterDB has been running.

Parameters* required
instanceIdstring
Optional instance ID override
limitnumber
Max entries to analyze
get_commandlog_historyGet persisted COMMANDLOG entries from storage (Valkey 8+ only). Supports time range filtering to investigate specific incidents. Returns empty with a note if COMMANDLOG is not supported on this instance.6 params

Get persisted COMMANDLOG entries from storage (Valkey 8+ only). Supports time range filtering to investigate specific incidents. Returns empty with a note if COMMANDLOG is not supported on this instance.

Parameters* required
commandstring
Filter by command name
endTimenumber
End time (Unix timestamp ms)
instanceIdstring
Optional instance ID override
limitnumber
Max entries to return
minDurationnumber
Min duration in microseconds
startTimenumber
Start time (Unix timestamp ms)
get_commandlog_patternsGet analyzed COMMANDLOG patterns from persisted storage (Valkey 8+ only). Like get_slowlog_patterns but includes large-request and large-reply patterns in addition to slow commands.4 params

Get analyzed COMMANDLOG patterns from persisted storage (Valkey 8+ only). Like get_slowlog_patterns but includes large-request and large-reply patterns in addition to slow commands.

Parameters* required
endTimenumber
End time (Unix timestamp ms)
instanceIdstring
Optional instance ID override
limitnumber
Max entries to analyze
startTimenumber
Start time (Unix timestamp ms)
get_anomaliesGet anomaly detection events from persisted storage. BetterDB continuously runs Z-score analysis on memory, hit rate, CPU, and other metrics — this returns the detected anomalies. Use to investigate what triggered an alert or correlate with an incident.4 params

Get anomaly detection events from persisted storage. BetterDB continuously runs Z-score analysis on memory, hit rate, CPU, and other metrics — this returns the detected anomalies. Use to investigate what triggered an alert or correlate with an incident.

Parameters* required
instanceIdstring
Optional instance ID override
limitnumber
Max events to return
metricTypestring
Filter by metric type
startTimenumber
Start time (Unix timestamp ms)
get_client_activityGet time-bucketed client activity from persisted snapshots. Shows connection counts, command distribution, and buffer usage over time. Use startTime/endTime to focus on a specific incident window.4 params

Get time-bucketed client activity from persisted snapshots. Shows connection counts, command distribution, and buffer usage over time. Use startTime/endTime to focus on a specific incident window.

Parameters* required
bucketSizeMinutesnumber
Bucket size in minutes (default 5)
endTimenumber
End time (Unix timestamp ms)
instanceIdstring
Optional instance ID override
startTimenumber
Start time (Unix timestamp ms)
get_hot_keysGet hot key tracking data from persisted storage. BetterDB periodically scans keys using LFU frequency scores (when maxmemory-policy is an LFU variant) or OBJECT IDLETIME / COMMANDLOG-derived frequency. Each snapshot captures the top keys ranked by access frequency. Use this t...4 params

Get hot key tracking data from persisted storage. BetterDB periodically scans keys using LFU frequency scores (when maxmemory-policy is an LFU variant) or OBJECT IDLETIME / COMMANDLOG-derived frequency. Each snapshot captures the top keys ranked by access frequency. Use this t...

Parameters* required
endTimenumber
End time (Unix timestamp ms)
instanceIdstring
Optional instance ID override
limitnumber
Max entries to return (default 50, max 200)
startTimenumber
Start time (Unix timestamp ms)
get_cluster_nodesDiscover all nodes in the Valkey cluster — role (master/replica), address, health status, and slot ranges. Returns an error message if this instance is not running in cluster mode.1 params

Discover all nodes in the Valkey cluster — role (master/replica), address, health status, and slot ranges. Returns an error message if this instance is not running in cluster mode.

Parameters* required
instanceIdstring
Optional instance ID override
get_cluster_node_statsGet per-node performance stats: memory usage, ops/sec, connected clients, replication offset, and CPU. Use this to identify hot nodes, lagging replicas, or uneven load distribution.1 params

Get per-node performance stats: memory usage, ops/sec, connected clients, replication offset, and CPU. Use this to identify hot nodes, lagging replicas, or uneven load distribution.

Parameters* required
instanceIdstring
Optional instance ID override
get_cluster_slowlogGet the aggregated slowlog across ALL nodes in the cluster. This is the primary tool for finding slow commands in cluster mode — per-node slowlogs are incomplete. Returns an error message if not in cluster mode.2 params

Get the aggregated slowlog across ALL nodes in the cluster. This is the primary tool for finding slow commands in cluster mode — per-node slowlogs are incomplete. Returns an error message if not in cluster mode.

Parameters* required
instanceIdstring
Optional instance ID override
limitnumber
Max entries to return (default 100)
get_slot_statsGet per-slot key counts and CPU usage (Valkey 8.0+ only). Use orderBy='cpu-usec' to find hot slots, or 'key-count' to find the most populated slots. Returns an error message if not supported.3 params

Get per-slot key counts and CPU usage (Valkey 8.0+ only). Use orderBy='cpu-usec' to find hot slots, or 'key-count' to find the most populated slots. Returns an error message if not supported.

Parameters* required
instanceIdstring
Optional instance ID override
limitnumber
Max slots to return (default 20)
orderBystring
Sort order: 'key-count' or 'cpu-usec' (default 'key-count')one of key-count · cpu-usec
get_latency_historyGet the full latency history for a named event (e.g. 'command', 'fast-command'). Call get_latency first to see which event names are available, then use this to investigate a specific event's trend over time.2 params

Get the full latency history for a named event (e.g. 'command', 'fast-command'). Call get_latency first to see which event names are available, then use this to investigate a specific event's trend over time.

Parameters* required
eventName*string
Latency event name to query
instanceIdstring
Optional instance ID override
get_acl_auditGet persisted ACL audit log entries from storage. Filter by username, reason (auth, command, key, channel), or time range. Use this to investigate why a connection is failing or audit access patterns.6 params

Get persisted ACL audit log entries from storage. Filter by username, reason (auth, command, key, channel), or time range. Use this to investigate why a connection is failing or audit access patterns.

Parameters* required
endTimenumber
End time (Unix timestamp ms)
instanceIdstring
Optional instance ID override
limitnumber
Max entries to return
reasonstring
Filter by reason (auth, command, key, channel)
startTimenumber
Start time (Unix timestamp ms)
usernamestring
Filter by username
start_monitorStart the BetterDB monitor as a persistent background process. If already running, returns the existing URL. The monitor persists across MCP sessions and must be stopped explicitly with stop_monitor.2 params

Start the BetterDB monitor as a persistent background process. If already running, returns the existing URL. The monitor persists across MCP sessions and must be stopped explicitly with stop_monitor.

Parameters* required
portinteger
Port for the monitor API (default 3001)default: 3001
storagestring
Storage backend (default sqlite)one of sqlite · memorydefault: sqlite
cache_listList all caches (semantic_cache and agent_cache) registered for the active instance, with hit rate and total ops.1 params

List all caches (semantic_cache and agent_cache) registered for the active instance, with hit rate and total ops.

Parameters* required
instanceIdstring
Connection ID; defaults to the active instance
cache_healthDetailed health for a single cache. Response branches by type: semantic_cache reports category_breakdown + uncertain_hit_rate; agent_cache reports tool_breakdown.2 params

Detailed health for a single cache. Response branches by type: semantic_cache reports category_breakdown + uncertain_hit_rate; agent_cache reports tool_breakdown.

Parameters* required
cache_name*string
Cache name as registered in __betterdb:caches (e.g. 'betterdb_scache_prod').
instanceIdstring
Connection ID; defaults to the active instance
cache_threshold_recommendationThreshold-tuning recommendation for a semantic_cache, based on the rolling similarity-score window. Errors with INVALID_CACHE_TYPE on agent_cache.4 params

Threshold-tuning recommendation for a semantic_cache, based on the rolling similarity-score window. Errors with INVALID_CACHE_TYPE on agent_cache.

Parameters* required
cache_name*string
Cache name as registered in __betterdb:caches (e.g. 'betterdb_scache_prod').
categorystring
Restrict to a single category; omit for the global threshold
instanceIdstring
Connection ID; defaults to the active instance
minSamplesinteger
Minimum samples required (default 100)
cache_tool_effectivenessPer-tool hit rate, cost saved, and TTL recommendation for an agent_cache. Errors with INVALID_CACHE_TYPE on semantic_cache.2 params

Per-tool hit rate, cost saved, and TTL recommendation for an agent_cache. Errors with INVALID_CACHE_TYPE on semantic_cache.

Parameters* required
cache_name*string
Cache name as registered in __betterdb:caches (e.g. 'betterdb_scache_prod').
instanceIdstring
Connection ID; defaults to the active instance
cache_similarity_distributionHistogram of recent similarity scores (20 buckets, width 0.1) for a semantic_cache. Errors on agent_cache.4 params

Histogram of recent similarity scores (20 buckets, width 0.1) for a semantic_cache. Errors on agent_cache.

Parameters* required
cache_name*string
Cache name as registered in __betterdb:caches (e.g. 'betterdb_scache_prod').
categorystring
Restrict to a single category
instanceIdstring
Connection ID; defaults to the active instance
window_hoursinteger
Lookback window (default 24h, max 168h)
cache_recent_changesRecent proposals for a single cache (any status), so agents can avoid re-proposing pending or recently-applied changes. Newest first.3 params

Recent proposals for a single cache (any status), so agents can avoid re-proposing pending or recently-applied changes. Newest first.

Parameters* required
cache_name*string
Cache name as registered in __betterdb:caches (e.g. 'betterdb_scache_prod').
instanceIdstring
Connection ID; defaults to the active instance
limitinteger
Max proposals to return (default 20, max 200)
cache_propose_threshold_adjustPropose a semantic-cache similarity-threshold change for review. Creates a pending proposal that requires human approval before any change is applied. Reasoning must be at least 20 characters.5 params

Propose a semantic-cache similarity-threshold change for review. Creates a pending proposal that requires human approval before any change is applied. Reasoning must be at least 20 characters.

Parameters* required
cache_name*string
Name of the semantic cache (e.g. 'betterdb_scache_prod')
categoryvalue
Optional per-category override; null/undefined = global threshold
instanceIdstring
Connection ID; defaults to the active instance
new_threshold*number
Proposed cosine-distance threshold, 0–2
reasoning*string
Why the change is being proposed (≥20 chars)
cache_propose_tool_ttl_adjustPropose an agent-cache per-tool TTL change for review. Creates a pending proposal that requires human approval. Reasoning must be at least 20 characters.5 params

Propose an agent-cache per-tool TTL change for review. Creates a pending proposal that requires human approval. Reasoning must be at least 20 characters.

Parameters* required
cache_name*string
Name of the agent cache (e.g. 'betterdb_agentcache_prod')
instanceIdstring
Connection ID; defaults to the active instance
new_ttl_seconds*integer
Proposed TTL in seconds (10–86400)
reasoning*string
Why the change is being proposed (≥20 chars)
tool_name*string
Tool whose TTL is being changed
cache_propose_invalidatePropose a cache invalidation for review. Filter shape depends on cache type: semantic_cache requires filter_kind=valkey_search + filter_expression; agent_cache requires filter_kind in (tool|key_prefix|session) + filter_value. Warns when estimated_affected exceeds 10000.7 params

Propose a cache invalidation for review. Filter shape depends on cache type: semantic_cache requires filter_kind=valkey_search + filter_expression; agent_cache requires filter_kind in (tool|key_prefix|session) + filter_value. Warns when estimated_affected exceeds 10000.

Parameters* required
cache_name*string
Name of the cache to invalidate
estimated_affected*integer
Caller-estimated number of affected entries
filter_expressionstring
Required when filter_kind=valkey_search; FT.SEARCH filter
filter_kind*string
Discriminator: valkey_search for semantic_cache; tool|key_prefix|session for agent_cacheone of valkey_search · tool · key_prefix · session
filter_valuestring
Required when filter_kind in (tool|key_prefix|session); the matching value
instanceIdstring
Connection ID; defaults to the active instance
reasoning*string
Why the invalidation is being proposed (≥20 chars)
cache_list_pending_proposalsList pending cache proposals for the active instance, newest first. Optionally filter by cache_name.3 params

List pending cache proposals for the active instance, newest first. Optionally filter by cache_name.

Parameters* required
cache_namestring
Restrict to a single cache
instanceIdstring
Connection ID; defaults to the active instance
limitinteger
Max proposals to return (default 100, max 200)
cache_get_proposalFetch a single cache proposal by id, including its audit trail.1 params

Fetch a single cache proposal by id, including its audit trail.

Parameters* required
proposal_id*string
Proposal id (returned by cache_propose_*)
cache_approve_proposalApprove a pending proposal. Synchronously applies the change to Valkey and returns the terminal status (applied|failed). Idempotent: a second call on an already-applied proposal returns the cached result.2 params

Approve a pending proposal. Synchronously applies the change to Valkey and returns the terminal status (applied|failed). Idempotent: a second call on an already-applied proposal returns the cached result.

Parameters* required
actorstring
Optional actor identity stamped into the audit trail
proposal_id*string
Proposal id
cache_reject_proposalReject a pending proposal. Optionally records a reason in the audit trail.3 params

Reject a pending proposal. Optionally records a reason in the audit trail.

Parameters* required
actorstring
Optional actor identity stamped into the audit trail
proposal_id*string
Proposal id
reasonstring
Optional rejection reason recorded on the audit row
cache_edit_and_approve_proposalEdit an existing pending proposal and approve it in one step. Provide exactly one edit field matching the proposal type: new_threshold for threshold_adjust, new_ttl_seconds for tool_ttl_adjust. Invalidate proposals are not editable.4 params

Edit an existing pending proposal and approve it in one step. Provide exactly one edit field matching the proposal type: new_threshold for threshold_adjust, new_ttl_seconds for tool_ttl_adjust. Invalidate proposals are not editable.

Parameters* required
actorstring
Optional actor identity stamped into the audit trail
new_thresholdnumber
For threshold_adjust proposals
new_ttl_secondsinteger
For tool_ttl_adjust proposals
proposal_id*string
Proposal id
stop_monitorStop a persistent BetterDB monitor process that was previously started with start_monitor or --autostart --persist.

Stop a persistent BetterDB monitor process that was previously started with start_monitor or --autostart --persist.

No parameters — call it with no arguments.

BetterDB Monitor

Docker Pulls Docker Image Version Artifact Hub npm npm downloads API Tests License Valkey Redis

The monitoring layer that Valkey deserves.

BetterDB persists what Valkey throws away - slowlogs, command patterns, client activity, anomaly signals - so you can debug what happened at 3am, not just what's happening now. Built for Valkey 8.x with native support for COMMANDLOG, CLUSTER SLOT-STATS, and per-thread I/O metrics. Redis 6+ compatible for everything else.

Website | Docker Hub | npm | Documentation | Blog

BetterDB is built by BetterDB Inc., a public benefit company operating under the OCV Open Charter.

BetterDB Monitor - Key Analytics with per-type key size distribution histograms

Quick Start (Docker)

docker run -d --name betterdb -p 3001:3001 betterdb/monitor:latest

Point your browser to http://localhost:3001. To monitor a specific instance:

docker run -d \
  --name betterdb \
  -p 3001:3001 \
  -e DB_HOST=your-valkey-host \
  -e DB_PORT=6379 \
  -e DB_PASSWORD=your-password \
  betterdb/monitor:latest

Connecting to a database on your host machine? Inside the container localhost is the container itself, not your host — so use host.docker.internal as the database host. On Docker Desktop (macOS/Windows) it works out of the box; on Linux add --add-host=host.docker.internal:host-gateway to the docker run command so the name resolves. The dashboard's one-click "connect to local instance" button auto-detects this and pre-fills the right host for you.

Two image variants are published, both multi-arch (linux/amd64, linux/arm64):

TagWhat it is
latest, X.Y.Z-no-aiDefault image - every monitoring feature included, without the dependencies for the experimental local-LLM AI Helper
X.Y.ZAdds the experimental AI Helper (bring your own Ollama; disabled by default via AI_ENABLED)

See Docker Production Deployment for persistent storage, custom ports, licensing, and air-gapped setups.

Quick Start (Kubernetes / Helm)

helm repo add betterdb https://docs.betterdb.com/charts
helm repo update
helm install betterdb-monitor betterdb/betterdb-monitor \
  --namespace betterdb --create-namespace \
  --set db.host=my-valkey.default.svc.cluster.local \
  --set db.password=yourpassword

Then kubectl port-forward -n betterdb svc/betterdb-monitor 3001:3001 and open http://localhost:3001, or enable the chart's ingress. PostgreSQL-backed history, bring-your-own Secrets, and air-gapped licensing are all covered in the Kubernetes guide and the chart README.

Quick Start (CLI)

Run BetterDB Monitor without Docker:

npx @betterdb/monitor

On first run, an interactive setup wizard guides you through database connection, storage backend (SQLite, PostgreSQL, or in-memory), and server settings. Configuration is saved to ~/.betterdb/config.json.

npm install -g @betterdb/monitor   # global install
betterdb --setup                   # re-run setup wizard
betterdb --port 8080               # override server port
betterdb --db-host 1.2.3.4         # override database host
betterdb --help                    # all options

Requires Node.js >= 20.0.0 and a Valkey or Redis instance to monitor. For SQLite storage, also npm install -g better-sqlite3.

What You Get

See everything, keep everything

  • Historical analytics - query slowlogs, command patterns, client activity, and latency across any time range. The data that used to disappear after a log rotation.
  • COMMANDLOG support - Valkey 8.1+ exclusive. Large requests and large replies, not just the slow ones.
  • MONITOR capture sessions - record real traffic on demand: live tail, filter, replay, export to JSON/CSV, and cross-reference against connection history.
  • Hot key tracking - top keys by access frequency with rank movement over time. Key Analytics (Pro, free in early access) adds type, TTL, and size distributions from live sampling.
  • Cluster visibility - topology graphs, SLOT-STATS heatmaps, per-slot CPU and key distribution.
  • CPU & I/O thread metrics - per-thread visibility that no Redis tool can provide.
  • Client analytics - see exactly which service is responsible for what, attributed by client name and pattern.
  • ACL audit trail - track who accessed what, persisted for compliance and post-incident debugging.

Understand and act

  • Anomaly detection (Pro, free in early access) - automatic baseline learning with correlated events and plain-English diagnoses. 20+ detectors, no manual thresholds.
  • Capacity forecasting - projected time-to-ceiling for memory, ops/sec, CPU, and fragmentation.
  • Webhooks - HMAC-signed alert deliveries with retries and a full delivery log.
  • Live migration - move between Redis and Valkey with a three-phase analysis, execution, and validation workflow.

Built for the AI era

  • Vector search observability - FT.SEARCH ops/sec and latency with per-index health for valkey-search and RediSearch. See docs/vector-ai.
  • Inference latency - p50/p95/p99 per index, with SLA breach alerts (Pro, free in early access).
  • Semantic cache intelligence (Pro, free in early access) - hit-rate health, similarity-threshold recommendations, and an approve/reject proposal workflow. Agent memory observability included.
  • AI traces - OTLP span waterfalls from your AI application, correlated with the live Valkey state underneath each request. See docs/opentelemetry.md.

Plugs into everything

  • MCP server - 60 tools for Claude Code, Cursor, or any MCP client via @betterdb/mcp.
  • Prometheus endpoint - 100+ betterdb_* metrics. See docs/prometheus-metrics.md.
  • OpenTelemetry - ingest OTLP traces, and mirror metrics and events to any OTLP backend. See docs/opentelemetry.md.
  • REST API - everything in the UI is an API call, documented via OpenAPI.

Access Your Data Your Way

InterfaceDetails
Web UIhttp://localhost:3001
MCP servernpx @betterdb/mcp (stdio) - create a token under Settings → MCP Tokens
Prometheushttp://localhost:3001/api/prometheus/metrics
REST API (OpenAPI)http://localhost:3001/docs
Health checkhttp://localhost:3001/api/health

Note: In production builds (Docker, CLI) API routes are served under the /api prefix. In local development (pnpm dev) there is no prefix - e.g. http://localhost:3001/health.

Supported Databases

DatabaseMinimum VersionSupported Features
Valkey8.0+All features including COMMANDLOG (8.1+) and CLUSTER SLOT-STATS
Redis6+All features except the Valkey-exclusive COMMANDLOG and CLUSTER SLOT-STATS

The backend uses a unified adapter over the wire-compatible iovalkey client and auto-detects Valkey vs Redis from the INFO response (DB_TYPE=auto). Capabilities like COMMANDLOG and SLOT-STATS are detected per version, and the UI gracefully degrades when a feature isn't available.

Managed services are supported too - guides for AWS ElastiCache, MemoryDB, Redis Cloud, and Upstash live in docs/providers, and @betterdb/agent reaches VPC-only instances over an outbound WebSocket.

Docker Production Deployment

The Docker image contains the monitoring application (backend + frontend). It requires:

  1. A Valkey/Redis instance to monitor
  2. A PostgreSQL instance for data persistence (or use memory storage)

Run with PostgreSQL Storage

docker run -d \
  --name betterdb-monitor \
  -p 3001:3001 \
  -e DB_HOST=your-valkey-host \
  -e DB_PORT=6379 \
  -e DB_PASSWORD=your-password \
  -e STORAGE_TYPE=postgres \
  -e STORAGE_URL=postgresql://user:pass@postgres-host:5432/dbname \
  betterdb/monitor

Run on Custom Port

Set the PORT environment variable and match the -p mapping:

docker run -d \
  --name betterdb-monitor \
  -p 8080:8080 \
  -e PORT=8080 \
  -e DB_HOST=your-valkey-host \
  betterdb/monitor

Run with Host Network (Access localhost services)

If your Valkey and PostgreSQL are running on the same host:

docker run -d \
  --name betterdb-monitor \
  --network host \
  -e DB_HOST=localhost \
  -e DB_PORT=6380 \
  -e DB_PASSWORD=devpassword \
  -e STORAGE_TYPE=postgres \
  -e STORAGE_URL=postgresql://dev:devpass@localhost:5432/postgres \
  betterdb/monitor

Environment Variables

VariableRequiredDefaultDescription
DB_HOSTYeslocalhostValkey/Redis host to monitor
DB_PORTNo6379Valkey/Redis port
DB_PASSWORDNo-Valkey/Redis password
DB_USERNAMENodefaultValkey/Redis ACL username
DB_TYPENoautoDatabase type: auto, valkey, or redis
STORAGE_TYPENomemoryStorage backend: memory or postgres
STORAGE_URLConditional-PostgreSQL connection URL (required if STORAGE_TYPE=postgres)
PORTNo3001Application HTTP port
NODE_ENVNoproductionNode environment
ANOMALY_DETECTION_ENABLEDNotrueEnable anomaly detection
ANOMALY_PROMETHEUS_INTERVAL_MSNo30000Prometheus summary update interval (ms)
BETTERDB_LICENSE_KEYNo-Online license key (Pro/Enterprise), validated over the network
BETTERDB_OFFLINE_LICENSE_FILENo-Path to a signed offline license .jwt for air-gapped hosts (see below)
BETTERDB_OFFLINE_LICENSENo-Offline license token as an inline JWT string
BETTERDB_DATA_DIRNo/app/dataDirectory for persisted license state (mount a writable volume)
ENCRYPTION_KEYNo-Key (min 16 chars) used to envelope-encrypt stored connection passwords and SSH tunnel secrets at rest. Without it, secrets are stored in plaintext
BETTERDB_SSH_KEY_DIRNo-Directory that server-side SSH private keys must live in. Enables the "server file path" key source for SSH tunnels; a connection's key path must resolve inside it. Unset disables file-based keys (inline pasted keys still work)
BETTERDB_TELEMETRYNotrueSet false to disable anonymous telemetry

Full reference, including AI, webhook tuning, and health-gate thresholds: docs/configuration.md. For OTLP trace ingest and metrics/event export, see docs/opentelemetry.md.

SSH Tunnels

Connections can reach a database through an SSH bastion/jump host instead of connecting directly — useful for Valkey/Redis in a private subnet, ElastiCache, or MemoryDB. Enable Connect via SSH tunnel when adding a connection and provide the SSH host, port, and username. A single hop is supported.

Authentication is either a password or a private key. Private keys come from one of two sources:

  • Paste key (inline): the PEM key content is submitted with the connection. It is stored encrypted at rest only when ENCRYPTION_KEY is set (envelope encryption); without that key it is stored in plaintext, like connection passwords. Works everywhere, including managed/cloud deployments.
  • Server file path: the key already lives on the monitor server's filesystem and is referenced by path. This requires setting the BETTERDB_SSH_KEY_DIR environment variable to the directory holding the allowed keys, and the referenced path must resolve inside it, so the API can never be coerced into reading arbitrary files. Leave BETTERDB_SSH_KEY_DIR unset to disable this option.

Optionally pin the SSH server's host key fingerprint (SHA256:...) on the connection; when set, the tunnel is refused unless the server presents a matching key, preventing man-in-the-middle attacks on the bastion path. Left blank, the server identity is not verified (a warning is logged).

The tunnel forwards to the database over 127.0.0.1; when TLS is enabled the certificate is still validated against the real database hostname. Set ENCRYPTION_KEY so SSH passwords, key passphrases, and inline keys are encrypted at rest.

Known limitation — cluster/Sentinel topologies: only the connection you configure is tunnelled. Cluster and Sentinel monitoring fan out to the other nodes using the addresses those nodes advertise (CLUSTER NODES / Sentinel), and those per-node connections are made directly, not through the tunnel. If the other nodes are only reachable via the bastion (e.g. ElastiCache/MemoryDB in a private subnet), per-node views will be unavailable. Use SSH tunnels for single-node/primary monitoring, or place the monitor where it can reach the cluster nodes directly.

Licensing & Air-Gapped Support

BetterDB Monitor unlocks Pro/Enterprise features in one of two ways, depending on whether the host has internet access:

  • Online license key - set BETTERDB_LICENSE_KEY. The monitor validates it against betterdb.com and caches a locally-verified signed token, so your tier keeps working through short outages and restarts.
  • Offline / air-gapped license token - for hosts with no internet access at all (see below).
How air-gapped licensing works

Every entitlement is a signed RS256 JWT. The monitor verifies it locally against public keys embedded in the image - it never has to reach a license server to trust a token. So an air-gapped host can run paid tiers with zero connectivity:

  1. On an internet-connected machine, sign in at betterdb.com/account/licenses and download your offline license token (.jwt, Pro/Enterprise). It contains no secrets and can't be tampered with - any edit breaks the signature.
  2. Transfer it to the air-gapped host however you like (USB, config management, a Docker/Kubernetes secret mount).
  3. Provide it via BETTERDB_OFFLINE_LICENSE_FILE (path), BETTERDB_OFFLINE_LICENSE (inline string), or paste it in the UI under Settings → License → "Air-gapped environment? Activate an offline license."

When an offline token is configured and no BETTERDB_LICENSE_KEY is set, the monitor makes zero outbound requests - license checks, telemetry, and update pings are all disabled. It runs the granted tier until the token expires (perpetual licenses re-download yearly), then reverts to Community.

# fully offline - no network required
docker volume create betterdb-data
docker run --rm -v betterdb-data:/d alpine chown 1001:1001 /d   # volume writable by UID 1001 (one-time)

docker run -d --name betterdb-monitor -p 3001:3001 \
  -e DB_HOST=your-valkey-host -e DB_PORT=6379 -e DB_PASSWORD=your-password \
  -v /path/to/betterdb-license.jwt:/run/secrets/betterdb-license.jwt:ro \
  -e BETTERDB_OFFLINE_LICENSE_FILE=/run/secrets/betterdb-license.jwt \
  -v betterdb-data:/app/data \
  betterdb/monitor

Verify with GET /api/license/status → source: offline-token, mode: offline, airGapped: true.

Persistence: mount a writable volume at /app/data so the offline license and the online outage-grace token survive restarts. The container runs as UID 1001, so a freshly-created volume must be chowned to it (shown above) - otherwise persistence fails with EACCES … license.jwt.

For the full flow, verification precedence, and key-rotation runbook see Offline & Air-Gapped Licenses and the Configuration reference.

Docker Image Details

  • Base Image: node:20-alpine
  • Compressed size: ~360MB (latest / -no-ai) / ~640MB (versioned image with the experimental AI Helper's local-LLM dependencies)
  • Platforms: linux/amd64, linux/arm64
  • Contains: Backend API + Frontend static files (served by Fastify)
  • Excluded: SQLite support (use PostgreSQL or Memory storage)

Container Operations

docker logs -f betterdb-monitor        # follow logs
docker stop betterdb-monitor           # stop
docker rm betterdb-monitor             # remove

Storage Backends

BetterDB Monitor persists audit trail, analytics, captures, and anomaly data to one of four backends:

BackendUse caseNotes
memoryTesting, ephemeral environmentsDefault in Docker; all data lost on restart
postgresProductionSTORAGE_TYPE=postgres + STORAGE_URL=postgresql://user:pass@host:port/db
tursoProduction / serverless SQLiteSTORAGE_TYPE=turso + STORAGE_URL=libsql://... + STORAGE_AUTH_TOKEN; works in Docker
sqliteLocal development / CLINative module stripped from the latest Docker image; STORAGE_SQLITE_FILEPATH optional

Prometheus Metrics

Metrics are exposed at GET /api/prometheus/metrics in Prometheus text format: ACL audit, client connections, slowlog/commandlog patterns, memory, throughput, keyspace, replication, cluster slot stats, and Node.js runtime metrics - all prefixed betterdb_.

scrape_configs:
  - job_name: 'betterdb-monitor'
    metrics_path: '/api/prometheus/metrics'
    static_configs:
      - targets: ['your-monitor-host:3001']

Full metric reference: docs/prometheus-metrics.md and docs/prometheus-integration.md.

Development

Project Structure

betterdb-monitor/
├── apps/
│   ├── api/                 # NestJS backend (Fastify)
│   └── web/                 # React frontend (Vite)
├── packages/                # Published packages (see below)
├── docs/                    # Documentation site (Jekyll)
├── docker-compose.yml       # Local Valkey (port 6380) and Redis (port 6382) for testing
└── package.json             # Workspace root

Packages

This monorepo ships several standalone packages. See packages/ for the full list.

PackageLanguageRegistry
@betterdb/monitorTypeScriptnpm
@betterdb/mcpTypeScriptnpm
@betterdb/agentTypeScriptnpm
@betterdb/semantic-cacheTypeScriptnpm
betterdb-semantic-cachePythonPyPI
@betterdb/agent-cacheTypeScriptnpm
betterdb-agent-cachePythonPyPI
cache-benchmarkPythonReplay harness for benchmarking semantic caches

Tech Stack

  • Backend: NestJS with Fastify adapter, iovalkey for Valkey/Redis connections, TypeScript strict mode. Port 3001.
  • Frontend: React + TypeScript, Vite, TailwindCSS, Recharts. Dev server on port 5173.
  • Monorepo: pnpm workspaces + Turborepo.

Local Setup

Prerequisites: Node.js >= 20.0.0, pnpm >= 9.0.0, Docker.

pnpm install
cp .env.example .env
pnpm docker:dev        # local Valkey (6380) and Redis (6382)
pnpm dev               # web on :5173, api on :3001

To connect to Redis instead of Valkey, set DB_PORT=6382 in .env.

pnpm dev:api           # API only
pnpm dev:web           # frontend only
pnpm docker:dev:down   # stop local databases
pnpm build             # production build
pnpm test              # API tests

Docker image builds:

pnpm docker:build      # local build
pnpm docker:publish    # multi-arch build & push (requires buildx)

Adding New Features

  1. Add new endpoints in apps/api/src/
  2. Add corresponding API calls in apps/web/src/api/
  3. Add shared types in packages/shared/src/types/

Code Style

  • TypeScript strict mode, explicit return types, no any
  • ESLint + Prettier configured

License

  • Content under docs/ is licensed under CC BY-SA 4.0.
  • Content under proprietary/ is covered by a commercial license (see proprietary/LICENSE). These features are free during early access.
  • Everything else is MIT.
Featured
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
inference shell
inference shell
create and run specialised agents in minutes
build now →
MCP-ready Email SendingMCP-ready Email Sending
MCP-ready Email Sending
Plug Mailtrap into your AI workflow and let it handle the email.
Connect Mailtrap MCP →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Capacitor - Shared memory for your team’s coding agents.
Capacitor - Shared memory for your team’s coding agents.
Make coding agent sessions - Searchable, Shareable, Vendor-neutral & Scored.
Try For Free →
CodeScene MCP ServerCodeScene MCP Server
CodeScene MCP Server
Your agent targets a perfect 10 Code Health score. Deterministic. Every commit.
Try For Free →
Give your AI the whole web as clean markdownGive your AI the whole web as clean markdown
Give your AI the whole web as clean markdown
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
belt - the only tool your agent needs
belt - the only tool your agent needs
belt cli automatically finds the best tools and skills for your agent. image, video, music, tts...
one prompt install →

Configuration

BETTERDB_URL

URL of the BetterDB monitor instance

BETTERDB_TOKENsecret

MCP authentication token generated from the BetterDB Settings page

BETTERDB_INSTANCE_ID

Instance ID to target when using multi-instance cloud deployments

Categories
Monitoring & Observability
Registryactive
Package@betterdb/mcp
TransportSTDIO
AuthRequired
Tools verifiedJun 10, 2026
UpdatedMar 14, 2026
View on GitHub

Related Monitoring & Observability MCP Servers

View all →
mcparmory avatar
Datadog

com.mcparmory/datadog

Monitor infrastructure, manage agents and deployments, track metrics, logs, and events
25
thotischner avatar
Observability Mcp

thotischner/observability-mcp

Unified observability gateway for AI agents — Prometheus, Loki & more, with anomaly detection.
5
tantiope avatar
Datadog Mcp

io.github.tantiope/datadog-mcp

Full Datadog API access: monitors, logs, metrics, traces, dashboards, and observability tools
4
us-all avatar
Datadog

io.github.us-all/datadog

Datadog MCP — 165 tools for metrics, monitors, logs, APM, RUM, incidents, CI/CD, fleet
1
com.newrelic avatar
New Relic MCP Server

com.newrelic/mcp-server

Access New Relic observability data through MCP - query metrics, logs, traces, entities, and more
dbsectrainer avatar
Mcp Agent Trace Inspector

dbsectrainer/mcp-agent-trace-inspector

Step-by-step observability for MCP agent workflows