mcp-elasticache-ops
Provides read-only observability and incident triage for Amazon ElastiCache clusters, including Valkey, Redis OSS, and Memcached. It combines data-plane diagnostics such as health, memory usage, slowlog, clients, replication, cluster topology, hot slots, keyspace sampling, and latency with AWS control-plane information such as ElastiCache events, CloudWatch metrics, parameter groups, and security posture across regions.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-elasticache-ops orders-prod is slow since 14:00, what's going on?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-elasticache-ops
Ask your AI assistant why your ElastiCache is slow. It can look at everything and change nothing.
A Model Context Protocol server for Amazon ElastiCache (Valkey, Redis OSS, Memcached), built on FastMCP. Point Claude, Cursor or any MCP client at your cluster and get the answers an on-call engineer needs in seconds: is it healthy, where is the memory, what is slow, who is connected, which keys are big or hot, what did AWS do to the cluster.
Why
Safe by construction. Every Redis command passes an allowlist of 53 read-only commands.
SET,DEL,FLUSHALL,CONFIG SET,EVALand evenGETare refused before they reach the network. Key values are never read. The AWS side only callsDescribe*,List*andGetMetricData. Tests fail if this ever drifts.Built for incidents.
node_triageandaws_triagereturn a worst-first list of findings in one call, so the model starts from the diagnosis instead of from rawINFOoutput.Data plane and control plane together. 65 tools join what Redis says (memory, slowlog, clients, replication, cluster slots) with what AWS says (events, CloudWatch, parameter groups, security posture), across regions.
Runbooks included. Four MCP prompts walk the model through high CPU, evictions, replication lag and connection storms, naming the tool to call at each step and what to conclude from it.
Production-minded. TLS and IAM auth, bounded
SCANsampling, output size caps, per-call timeouts, secrets never returned by any tool.
Related MCP server: mcp-cloudwatch-explorer
What it looks like
You: orders-prod is slow since 14:00. What is going on?
Assistant: (calls
aws_triage,node_triage,node_commandstats) Evictions started at 14:02 on shard 2 aftermaxmemorywas reached. Policy isallkeys-lruand one hash prefix holds most of the sampled memory. A maintenance event also touched the replica at 13:55. Next step: raise the node type or set a TTL on that prefix.
Quick start
uvx --from git+https://github.com/ritojoao/mcp-elasticache-ops mcp-elasticache-opsClaude Desktop / Claude Code:
{
"mcpServers": {
"elasticache-ops": {
"command": "uvx",
"args": ["--from", "git+https://github.com/ritojoao/mcp-elasticache-ops", "mcp-elasticache-ops"],
"env": {
"ELASTICACHE_HOST": "my-rg.xxxxxx.ng.0001.use1.cache.amazonaws.com",
"ELASTICACHE_TLS": "true",
"AWS_REGION": "us-east-1",
"AWS_PROFILE": "readonly"
}
}
}
}Give the AWS profile only elasticache:Describe* and cloudwatch:GetMetricData (see
Minimal IAM policy). Full options are in Configuration.
Inspired by the scope of call518/MCP-PostgreSQL-Ops, written from scratch for ElastiCache.
Tools
All 65 tools are annotated readOnlyHint=true, destructiveHint=false.
Data plane (redis-py, talks to the node endpoint)
Tool | What it does |
| One-shot summary: engine/version, role, memory, clients, hit ratio, evictions, findings |
| Why can't I connect: staged diagnosis of the configured endpoint that stops at the first failure, each stage with timing and a verdict. DNS ( |
| On-call snapshot in one call: health, memory, replication, clients, failed/rejected commandstats, top-5 slowlog, latency and the |
|
|
| Shard skew and hot slots on a cluster-mode group: per shard |
| Pub/Sub pressure from |
| Raw |
| used/RSS/peak/dataset/overhead, maxmemory + policy, fragmentation verdict, |
| Allowlisted |
|
|
| Bounded |
|
|
|
|
| Client-side PING RTT percentiles + |
| Valkey 8 |
|
|
| Commands ranked by total CPU time ( |
| Bounded |
| Role, replicas with byte lag, link status, backlog; findings for lagging or link-down replicas, offset gap vs the primary, |
| Cluster mode: |
|
|
| Fan-out |
| Cluster-wide |
| Same fan-out for |
| Same fan-out for memory: per-shard used/maxmemory/fragmentation/evictions, skew and >90% findings |
|
|
| Memcached |
| Fan-out over |
| Reads |
Control plane (boto3, optional)
Tool | What it does |
|
|
|
|
|
|
|
|
|
|
| Per-shard skew from CloudWatch only (one |
|
|
|
|
|
|
| Read-only check that replicas are usable for reads, from |
| Read-only headroom for online resharding and node-type change, from |
| Read-only engine upgrade pre-flight for one replication group (no new IAM actions: |
|
|
| CloudWatch |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| One call per replication group: status/Multi-AZ/failover, last 6h events, CloudWatch peaks per member (EngineCPU, memory %, Evictions, ReplicationLag, CurrConnections), pending service updates, newest snapshot. Worst-first findings (max 30); a failing section is reported |
| One call per serverless cache: status and usage limits, snapshot health, 6h |
| One findings-first call per replication group: shards, replicas per shard, AZ spread, failover, engine version joined with per-node CloudWatch (EngineCPU, memory %, ReplicationLag, Evictions, CurrConnections, NewConnections). Flags nodes above 1.5x the peer median, reader endpoint gaps and right-sizing (memory p95 < 30% and CPU p95 < 20%; data tiering for r6gd). Worst-first, bounded; |
|
|
|
|
| Fleet-wide hardening roll-up from the Describe data other tools already read (no new IAM actions): replication groups, standalone and memcached clusters, serverless caches, users and user groups. Findings first: counts by severity, then findings grouped by category (encryption in transit, encryption at rest and KMS, authentication, ACL, network exposure, snapshots, patching), each naming the resource, then a per-resource pass/fail matrix capped to |
| Fleet-wide days until memory is full, findings first: 14 days of hourly |
| Findings-first cost and right-sizing across groups and serverless caches: node type and count, reserved coverage, 14-day peak memory/CPU (the window covers the 7 days a right-sizing call needs) (one |
|
|
|
|
| Diff of two parameter groups: only modified parameters whose values differ, family mismatch, important parameters flagged |
Regions (global datastore, multi-region on-call)
Every aws_* tool takes an optional read-only region argument (for example eu-west-1, the secondary region of a global
datastore). It must look like an AWS region name (us-east-1, eu-central-2, us-gov-west-1); anything else is rejected.
The default is AWS_REGION. Credentials, timeouts and retry bounds are the same in every region, and only
Describe* / List* / GetMetricData calls are made.
Set ELASTICACHE_REGIONS=us-east-1,eu-west-1 (max 8) to fan out: aws_replication_groups queries every listed region
and tags each group and finding with its region (a region that fails is listed under region_errors), and aws_triage
triages the group in the first region that holds it. Passing region explicitly overrides the list.
Tags and ownership
aws_cluster_overview, aws_triage and aws_serverless_triage read the resource tags with ListTagsForResource
(read-only, at most 3 calls per tool call: the replication group, then a member cluster) and return tags (max 25) and
ownership (the owner, team and environment/env tags, keys matched case-insensitively) so the on-call person
knows whom to page. A resource with none of them gets an info finding. If the principal lacks
elasticache:ListTagsForResource the tool still succeeds and returns a tags_note instead.
aws_replication_groups also returns per-group findings (Multi-AZ, failover, encryption, auth, snapshots, old Redis OSS,
engine behind the newest minor, primary and replicas in one AZ). aws_cache_clusters adds findings for Redis OSS end of life,
parameter group family mismatch, changes pending a reboot, no TLS, no AUTH and auto minor upgrade off. aws_serverless_caches
flags missing usage limits, snapshots and user group; aws_metrics on a serverless cache compares usage with the configured limits
and gives right-sizing hints (info/warning) on node clusters.
Serverless endpoints refuse many commands (INFO sections, CLUSTER NODES, CONFIG). The data-plane tools detect
*.serverless.*.cache.amazonaws.com hosts and, on any endpoint, degrade to a note instead of an error.
Control-plane tools return findings first ({"severity", "message", "resource"}, worst first).
Without AWS credentials or region, the aws_* tools return {"unavailable": ...} instead of failing,
so the server is useful against a plain Redis/Valkey too.
Sustained versus spike, p95 and trend
EngineCPUUtilization, DatabaseMemoryUsagePercentage and CurrConnections breaches are only reported at warning or
critical when at least 50% of the datapoints are above the threshold (message says sustained (>=50% of points)); a
shorter breach is an info finding saying transient spike. Every metric summary carries p95, the paging metrics add
fraction_above_threshold, and memory adds trend (first-quarter versus last-quarter average, with a rough
hours_to_full when growth is gradual). The time-to-full hint is a linear estimate: below 24 h it is a warning, else info.
On-call runbooks (MCP prompts)
Five step-by-step playbooks (CPU, evictions, replication lag, connection storm, failover and restore readiness) are in docs/runbooks.md.
Four prompts (not tools, the read-only tool count is unchanged) return a step-by-step runbook that chains the tools
and says what to conclude from each. Each takes replication_group_id.
oncall_high_cpu:aws_triage,aws_cluster_overview,node_triage,node_cluster_slowlog,node_commandstats,node_clients,aws_metricsoncall_evictions_memory:aws_triage,aws_metrics,node_memory,node_cluster_memory,node_keyspace_sample,aws_parametersoncall_replication_lag:aws_triage,aws_events,node_replication,aws_metrics,aws_global_replication_groupsoncall_connection_storm:aws_triage,aws_metrics,node_clients,node_latency,node_acl_log,aws_alarms
Network allowance and auth signals
Redis nodes are checked against the four real ENA allowance metrics (NetworkBandwidthInAllowanceExceeded,
NetworkBandwidthOutAllowanceExceeded, NetworkPacketsPerSecondAllowanceExceeded,
NetworkConntrackAllowanceExceeded) plus FreeableMemory; each warning names the limit that was hit. The auth
metrics AuthenticationFailures, CommandAuthorizationFailures and KeyAuthorizationFailures raise a finding on any
sustained count and point at node_acl_log. All of this uses GetMetricData only.
Finding thresholds
Fixed, bounded thresholds (not configurable) behind the data-plane findings that node_health, node_triage
and node_memory emit:
Finding | Threshold | Severity |
Memory near the limit |
| critical |
|
| critical |
Fragmentation |
| warning |
Evictions |
| warning |
Failed persistence |
| warning |
Fork latency |
| warning / critical |
Replication resync trouble |
| warning |
Client eviction |
| warning |
Error replies |
| warning |
Burstable CPU credits |
| warning / critical |
Replica link down |
| critical |
Large client buffers |
| warning |
Connection pressure |
| warning / critical |
Client buffer memory |
| warning |
Connection churn |
| warning |
Memcached evictions, low hit ratio | evictions > 0, hit ratio < 80% over at least 100 gets | warning |
Memcached evictions below limit | evictions > 0 while | warning |
Memcached huge items | node >= 90% full with an average item of 256 KiB or more | info |
Log delivery | Redis/Valkey without an active | warning / info |
Transit encryption mode |
| warning |
AUTH token age |
| info |
Pub/Sub pattern subscriptions |
| warning / critical |
Pub/Sub subscriber buffers | pubsub client | warning / critical |
Idle clients | 20 or more clients idle over an hour in | info |
No-TTL dominance | >= 90% of at least 20 sampled keys without TTL under an eviction policy ( | warning / info |
Low hit rate |
| warning / critical |
Overdue required update |
| critical |
Window overlap |
| warning |
Engine version | Redis OSS <= 6.x, Memcached < 1.6 (end-of-life), a Memcached version missing from | warning |
Safety model
Every Redis command goes through
SafeRedis, an allowlist of read-only commands (INFO,SCAN,TYPE,MEMORY USAGE,OBJECT FREQ,SLOWLOG GET,CLIENT LIST, ...). Anything else -SET,DEL,FLUSHALL,CONFIG SET,CLIENT KILL,EVAL,MULTI, evenGET- raisesReadOnlyViolationbefore it reaches the network. Values are never read.KEYSis refused; key sampling uses boundedSCANwith a hard cap.CONFIG GETis allowed only for an explicit set of non-sensitive parameters (maxmemory*,slowlog-*,latency-*,maxclients, ...).*,requirepass,masterauth,tls-*and glob patterns are refused. Command names with extra tokens or whitespace are rejected, so a subcommand cannot be smuggled in.node_inforedacts password-like fields;node_slowloghides arguments unlessinclude_args=true.node_keyspace_sampleonly inspects the connected node: in cluster mode that is only its own slots (the result says so). Usenode_cluster_keyspace_sample,node_cluster_slowlogandnode_cluster_memoryfor the whole cluster, ornode_cluster_nodes/node_cluster_healthfor topology and a fan-outINFO. Fan-out clients are built byconnection.build_clientand areSafeRedistoo; a test fails if any module creates a bareredis.Redis. Arguments ofMEMORY USAGE,SCAN,CLIENT LIST,OBJECTandACL LOGare validated.Control plane only calls
Describe*/List*/GetMetricData. Give it an IAM policy withelasticache:Describe*andcloudwatch:GetMetricDataonly.Passwords / AUTH tokens come from the environment or a file and are never returned by tools.
Allowlist
Generated from safe_client.py; the tests fail if this drifts from the code.
Allowed commands (53):
ACL LOG,ACL USERS,ACL WHOAMI,CLIENT GETNAME,CLIENT ID,CLIENT INFO,CLIENT LIST,CLUSTER COUNTKEYSINSLOT,CLUSTER INFO,CLUSTER LINKS,CLUSTER MYID,CLUSTER NODES,CLUSTER SHARDS,CLUSTER SLOTS,COMMANDLOG GET,COMMANDLOG LEN,COMMAND COUNT,COMMAND DOCS,CONFIG GET,DBSIZE,EXISTS,HLEN,INFO,LASTSAVE,LATENCY DOCTOR,LATENCY HISTOGRAM,LATENCY HISTORY,LATENCY LATEST,LLEN,MEMORY DOCTOR,MEMORY STATS,MEMORY USAGE,OBJECT ENCODING,OBJECT FREQ,OBJECT IDLETIME,PFCOUNT,PING,PTTL,PUBSUB CHANNELS,PUBSUB NUMPAT,PUBSUB NUMSUB,PUBSUB SHARDCHANNELS,ROLE,SCAN,SCARD,SLOWLOG GET,SLOWLOG LEN,STRLEN,TIME,TTL,TYPE,XLEN,ZCARDCONFIG GETexact names:appendfsync,appendonly,client-query-buffer-limit,cluster-allow-reads-when-down,cluster-enabled,cluster-node-timeout,cluster-require-full-coverage,databases,dynamic-hz,hz,io-threads,lfu-decay-time,lfu-log-factor,maxclients,min-replicas-max-lag,min-replicas-to-write,notify-keyspace-events,proto-max-bulk-len,rdbcompression,repl-backlog-size,repl-backlog-ttl,repl-diskless-sync,replica-read-only,save,tcp-keepalive,timeoutCONFIG GETprefixes:maxmemory*,slowlog-*,latency-*,activedefrag*,active-defrag-*,lazyfree-*,hash-max-*,list-max-*,set-max-*,zset-max-*,client-output-buffer-limit*Always refused (self-tested never to be allowed):
ACL,ACL DELUSER,ACL GETUSER,ACL LIST,ACL LOG RESET,ACL SETUSER,AUTH,BGREWRITEAOF,BGSAVE,CLIENT KILL,CLIENT PAUSE,CLIENT REPLY,CLIENT TRACKING,CLIENT UNPAUSE,CLUSTER FAILOVER,CLUSTER RESET,COMMANDLOG,COMMANDLOG HELP,COMMANDLOG RESET,CONFIG RESETSTAT,CONFIG REWRITE,CONFIG SET,DEBUG,DEL,DUMP,EVAL,EVALSHA,EXEC,EXPIRE,FAILOVER,FCALL,FLUSHALL,FLUSHDB,FUNCTION,GET,HELLO,HGET,HGETALL,KEYS,LATENCY RESET,LRANGE,MEMORY PURGE,MGET,MIGRATE,MODULE LOAD,MONITOR,MULTI,OBJECT HELP,PSUBSCRIBE,PSYNC,PUBLISH,PUBSUB,PUBSUB HELP,PUBSUB SHARDNUMSUB,REPLICAOF,RESTORE,SAVE,SCRIPT,SCRIPT FLUSH,SCRIPT LOAD,SET,SHUTDOWN,SLAVEOF,SLOWLOG RESET,SMEMBERS,SORT,SSUBSCRIBE,SUBSCRIBE,SYNC,UNLINK,WATCH,XRANGE,XREAD,XREADGROUP,ZRANGEMemcached: only
stats,stats settings|slabs|items|conns,config get clusterandversion.AWS: operation names must start with
describe_,list_orget_metric_data.
Minimal IAM policy
Which tool needs which action (and which tools lose data if one action is withheld) is in docs/iam-matrix.md, generated from the code and checked by tests/test_iam_policy.py; a new boto3 call missing from this policy or from the matrix fails CI.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"elasticache:DescribeReplicationGroups",
"elasticache:DescribeCacheClusters",
"elasticache:DescribeServerlessCaches",
"elasticache:DescribeEvents",
"elasticache:DescribeCacheParameters",
"elasticache:DescribeEngineDefaultParameters",
"elasticache:DescribeCacheParameterGroups",
"elasticache:DescribeCacheEngineVersions",
"elasticache:DescribeSnapshots",
"elasticache:DescribeServerlessCacheSnapshots",
"elasticache:DescribeUsers",
"elasticache:DescribeUserGroups",
"elasticache:DescribeGlobalReplicationGroups",
"elasticache:DescribeReservedCacheNodes",
"elasticache:DescribeReservedCacheNodesOfferings",
"elasticache:DescribeServiceUpdates",
"elasticache:DescribeUpdateActions",
"elasticache:DescribeCacheSubnetGroups",
"elasticache:ListTagsForResource",
"cloudwatch:GetMetricData",
"cloudwatch:DescribeAlarms"
],
"Resource": "*"
}
]
}Configuration
Variable | Default | |
|
| Primary/reader/configuration endpoint |
|
| |
| RBAC user | |
| AUTH token | |
|
| Set |
|
|
|
| CA bundle used to verify the endpoint (must exist) | |
|
| Keep certificate validation but skip hostname matching |
|
| IAM authentication: needs TLS, |
| Replication group id or serverless cache name used to sign the IAM token | |
| Reader endpoint (reserved for read-side checks) | |
|
| |
|
| Socket timeout (s), must be greater than 0 |
| / | For |
| Comma-separated | |
|
| Cap on any tool result (JSON characters, 1000 to 5000000). Longer lists are cut to their head; |
| Standard boto3 credential chain | |
| Comma-separated regions (max 8) that | |
|
| Connect and read timeout for every AWS API call (greater than 0, at most 120) |
|
| Attempts per AWS call, botocore |
|
|
|
Invalid values (non-numeric or out-of-range port, timeout <= 0, missing CA file, incomplete IAM settings) stop startup with a clear error.
ElastiCache notes: CONFIG GET is restricted by the service and this server allows only a small allowlist of it,
so the tools fall back to the parameter group (aws_parameters) where needed. LATENCY LATEST is empty unless latency-monitor-threshold is set in
the parameter group. Hot keys need an *-lfu maxmemory-policy.
Run
uv sync
uv run mcp-elasticache-ops # stdio
uv run mcp-elasticache-ops --transport http --port 8000Claude Desktop / Claude Code:
{
"mcpServers": {
"elasticache-ops": {
"command": "uv",
"args": ["--directory", "/path/to/mcp-elasticache-ops", "run", "mcp-elasticache-ops"],
"env": {
"ELASTICACHE_HOST": "my-rg.xxxxxx.ng.0001.use1.cache.amazonaws.com",
"ELASTICACHE_TLS": "true",
"AWS_REGION": "us-east-1",
"AWS_PROFILE": "readonly"
}
}
}
}Tests
uv run pytest -q # unit tests; control plane uses moto + botocore Stubber, never real AWS
uv run pytest -q --cov=mcp_elasticache_ops # 80% coverage gate (about 93% without a live server)
scripts/integration.sh # starts valkey/valkey:8-alpine (--rm, removed on exit) and runs everything
IMAGE=redis:7-alpine scripts/integration.sh
scripts/integration.ps1 # Windows: disk gate (>= 5G free), cluster up, `pytest -m integration`, then `down -v`, `image prune -f`, fstrim
scripts/cluster-integration.sh # 3-node valkey cluster via tests/docker-compose.cluster.yml, torn down with `down -v`scripts/integration.ps1 (-MinFreeGB, -Wsl:$false for a native Docker) skips itself below the gate and always tears down in a
finally block; it never runs prune -a.
Disk gate: the integration scripts pull images and grow the WSL vhdx, so run them only with at least 5G free on the
system drive (df -h /c). Below that, skip integration and rely on the unit suite. CI runs the integration job
weekly (on.schedule) and on push, and on demand through workflow_dispatch or the integration pull-request label, so drift in the live-server tests shows up without a code change. Tests that
start Docker must remove their own containers and volumes (--rm, down -v).
The cluster test (tests/test_dataplane_integration.py, marker integration, needs CLUSTER_TEST_HOST and
CLUSTER_TEST_PORT) runs node_cluster_nodes and the cluster fan-out against that cluster. CI runs it in the
cluster job and removes the stack in an always() step; the lint job also builds the wheel and imports it in an
isolated interpreter (python -I).
Generated files
docs/iam-matrix.md and tests/tool_schemas.json are generated from the code. After adding or changing a tool run
uv run python -I scripts/regen.pyand commit the result. The lint job runs the same script and fails on git diff --exit-code when either file is stale. The README tool table and the "All N tools" line are checked by scripts/release-check.sh. Engine version quirks live only in src/mcp_elasticache_ops/quirks.py; every entry needs a remediation and a parseable version range (tests/test_engine_quirks.py).
More
SECURITY.md explains the read-only guarantee; CHANGELOG.md lists changes.
License
MIT
Available Tools
65 toolsaws_alarmsAws AlarmsARead-onlyIdempotent
CloudWatch alarm coverage. Findings first: alarms in ALARM, INSUFFICIENT_DATA or with actions disabled, members with no alarm on core metrics (CPU, memory, evictions, lag, connections, swap). partial=true if denied. No group id covers ELASTICACHE_REGIONS.
Inputs: region, replication_group_id. Returns: object
aws_backup_auditAws Backup AuditBRead-onlyIdempotent
Fleet backup hygiene (DescribeSnapshots plus groups/clusters). Findings first: retention 0, no recent automatic snapshot, latest failed, old manual snapshots, snapshots of deleted groups.
Inputs: region, manual_days, stale_hours. Returns: object
aws_cache_clustersAws Cache ClustersBRead-onlyIdempotent
DescribeCacheClusters: per-node-cluster engine version, node type, parameter group and apply status, maintenance window, pending changes and node endpoints.
Inputs: region, show_nodes, cache_cluster_id. Returns: object
aws_capacity_forecastAws Capacity ForecastARead-onlyIdempotent
Days until memory is full across the fleet, findings first, from 14 days of DatabaseMemoryUsagePercentage
(Serverless: BytesUsedForCache vs the storage maximum), soonest first. Under 7 days critical, under 30
warning. All ELASTICACHE_REGIONS unless region is set.
Inputs: region. Returns: object
aws_cluster_overviewAws Cluster OverviewARead-onlyIdempotent
One findings-first call per replication group: shards, replicas, AZ spread, failover, engine version plus per-node CloudWatch signals; flags outlier nodes, reader gaps, right-sizing. No group id: fleet mode.
Inputs: region, minutes, replication_group_id. Returns: object
aws_cost_overviewAws Cost OverviewARead-onlyIdempotent
Fleet cost and right-sizing, findings first: node type and count, reserved coverage, peak memory/CPU per group
and serverless cache. Flags idle groups, oversized nodes (names the smaller node type), idle replicas,
on-demand and non-Graviton nodes, old snapshots, uncapped serverless. All ELASTICACHE_REGIONS unless region.
Inputs: region. Returns: object
aws_engine_versionsAws Engine VersionsARead-onlyIdempotent
DescribeCacheEngineVersions: available versions with parameter group family, plus upgrade targets (latest minor of each major; latest Valkey when asking about Redis OSS).
Inputs: engine (required), region, version_prefix. Returns: object
aws_eventsAws EventsBRead-onlyIdempotent
DescribeEvents, findings first: failover/failure critical, replacement/reboot/maintenance warning, worst then
newest; counts per source and the 100 newest events (truncated if more). Invalid source_type is refused.
Inputs: hours, region, source_type, source_identifier. Returns: object
aws_failover_readinessAws Failover ReadinessBRead-onlyIdempotent
Would a primary failure be survived? Findings first: failover or Multi-AZ off, shards without replicas, replicas in the primary's AZ, uneven or unavailable replicas, single-node group, recovery-risk level.
Inputs: replication_group_id (required), region. Returns: object
aws_global_datastore_failover_readinessAws Global Datastore Failover ReadinessARead-onlyIdempotent
Global datastore failover readiness from DescribeGlobalReplicationGroups and GlobalDatastoreReplicationLag. Findings first, then per datastore: readiness (blocked, attention, ready), reasons, primary region, and each secondary's status, node type, engine version and max replication lag.
Inputs: region. Returns: object
aws_global_replication_groupsAws Global Replication GroupsCRead-onlyIdempotent
DescribeGlobalReplicationGroups: global datastore members, regions, roles and status.
Inputs: region. Returns: object
aws_maintenanceAws MaintenanceBRead-onlyIdempotent
Maintenance urgency. Findings first: required updates past apply-by, maintenance windows overlapping the snapshot window, end-of-life engines. partial=true if a call is denied. No group id covers ELASTICACHE_REGIONS.
Inputs: region, replication_group_id. Returns: object
aws_metricsAws MetricsBRead-onlyIdempotent
CloudWatch AWS/ElastiCache metrics (Redis/Valkey: EngineCPUUtilization, memory %, Evictions, CacheHitRate, ReplicationLag; Memcached: CPU, swap, evictions, connections). Findings first, then min/avg/max/latest; raw series only with include_series=true.
Inputs: region, metrics, minutes, node_id, +5 more. Returns: object
aws_parameter_driftAws Parameter DriftARead-onlyIdempotent
DescribeCacheParameters on two groups: only parameters whose values differ and that someone modified (default-only differences are counted, not listed), plus family mismatch warnings.
Inputs: group_a (required), group_b (required), region. Returns: object
aws_parameter_groupsAws Parameter GroupsARead-onlyIdempotent
DescribeCacheParameterGroups joined with running clusters: unused custom groups, family mismatch, and risky Source=user settings (noeviction, timeout, keepalive, reserved-memory, lazyfree, slowlog).
Inputs: region, audit_settings. Returns: object
aws_parametersAws ParametersARead-onlyIdempotent
DescribeCacheParameters for a parameter group; by default only values changed (Source=user). Findings flag risky settings (noeviction, tiny output buffers, timeout 0, low maxmemory-samples).
Inputs: parameter_group (required), region, only_modified, diff_engine_defaults. Returns: object
aws_reader_endpoint_auditAws Reader Endpoint AuditARead-onlyIdempotent
Are replicas usable for reads? Findings first: clients likely on the primary endpoint, no reader endpoint, single-replica shards, replicas in the primary's AZ, high ReplicationLag.
Inputs: replication_group_id (required), region. Returns: object
aws_replication_group_auditAws Replication Group AuditARead-onlyIdempotent
HA and config posture per replication group in one call. Findings first, each with a next tool: Multi-AZ or
failover off, zero replicas, replicas in one AZ, big node without cluster mode, no snapshots or log delivery,
encryption mix, network type.
Inputs: region, replication_group_id. Returns: object
aws_replication_groupsAws Replication GroupsARead-onlyIdempotent
DescribeReplicationGroups: status, engine, cluster mode, node type, Multi-AZ,
failover, encryption, shards with primary/reader endpoints and member roles. Queries every region in
ELASTICACHE_REGIONS unless region is given.
Inputs: region, replication_group_id. Returns: object
aws_reserved_nodesAws Reserved NodesARead-onlyIdempotent
DescribeReservedCacheNodes plus running nodes, findings first: reservations expiring in 30/90 days,
reservations matching no node, nodes no reservation covers (node-hours billed on demand). All ELASTICACHE_REGIONS
unless region.
Inputs: region. Returns: object
aws_reserved_offeringsAws Reserved OfferingsARead-onlyIdempotent
DescribeReservedCacheNodesOfferings: 1y/3y offerings for a node type and engine (capped), the number of running nodes no reservation covers and the cheapest offering per term. Never purchases anything.
Inputs: engine (required), node_type (required), region. Returns: object
aws_scale_readinessAws Scale ReadinessARead-onlyIdempotent
Headroom for resharding or a node-type change, from 7 days of CloudWatch. Findings first: is scale-in safe (projected memory per surviving shard), is scale-out advised, why a node-type change is risky (burstable credits, replica lag, pending modification, Multi-AZ off). Describe and GetMetricData only.
Inputs: replication_group_id (required), region. Returns: object
aws_security_auditAws Security AuditARead-onlyIdempotent
Fleet hardening roll-up from existing Describe data (no new IAM), Redis and Memcached. Findings first: counts
by severity, findings by category (transit, at rest, auth, ACL, network, snapshots, patching) naming the
resource, then a pass/fail matrix capped to top. A denied call is a note, partial=true.
Inputs: top, region. Returns: object
aws_serverless_cachesAws Serverless CachesCRead-onlyIdempotent
DescribeServerlessCaches for ElastiCache Serverless (Valkey/Redis OSS/Memcached).
Inputs: region. Returns: object
aws_serverless_snapshotsAws Serverless SnapshotsARead-onlyIdempotent
DescribeServerlessCacheSnapshots plus DescribeServerlessCaches: findings for caches without a recent snapshot, failed snapshots, snapshots about to expire, missing KMS key and unset retention.
Inputs: region, stale_hours, snapshot_type, serverless_cache_name. Returns: object
aws_serverless_triageAws Serverless TriageARead-onlyIdempotent
One-call incident summary for a serverless cache: status, usage limits, snapshot health, 6h ThrottledCmds/ECPU/storage vs limits. Findings worst-first (max 30); a failing section is reported unavailable.
Inputs: serverless_cache_name (required), region. Returns: object
aws_service_updatesAws Service UpdatesBRead-onlyIdempotent
DescribeServiceUpdates: pending updates by severity with apply-by and auto-update dates.
Inputs: region, status. Returns: object
aws_shard_balanceAws Shard BalanceARead-onlyIdempotent
Per-shard skew from CloudWatch only (no data-plane connection). Findings first: hot shard (over 2x the median and above 50% CPU), memory skew, one primary pinned near 100% CPU (hot-key signature).
Inputs: replication_group_id (required), region, minutes. Returns: object
aws_snapshot_restore_readinessAws Snapshot Restore ReadinessARead-onlyIdempotent
Can this group or serverless cache be restored? Pass exactly one id. Findings first: backups off, stale, expired or failed snapshot, none before an engine upgrade, KMS mismatch, snapshot too big for the target node.
Inputs: region, stale_hours, replication_group_id, serverless_cache_name. Returns: object
aws_snapshotsAws SnapshotsBRead-onlyIdempotent
DescribeSnapshots: age, size, status, automatic vs manual, with findings for retention gaps, failed snapshots and groups without automatic backups.
Inputs: region, source, stale_hours, cache_cluster_id, +1 more. Returns: object
aws_subnet_groupsAws Subnet GroupsBRead-onlyIdempotent
DescribeCacheSubnetGroups: VPC, subnets and AZ spread (flags groups in fewer than 2 AZs).
Inputs: region. Returns: object
aws_triageAws TriageARead-onlyIdempotent
One-call incident summary for a replication group: status, Multi-AZ/failover, 6h events, CloudWatch peaks per member, pending updates, snapshot age. Findings worst-first (max 30); a failing section is reported unavailable.
Inputs: replication_group_id (required), region. Returns: object
aws_upgrade_planAws Upgrade PlanARead-onlyIdempotent
Engine upgrade pre-flight, verdict first: go or no-go plus blockers (version path, Redis to Valkey, parameter group family, status, failover, snapshot freshness), then caveats (ACL/TLS, quirks, service updates, window). An unreadable gate blocks. Describe calls only.
Inputs: replication_group_id (required), region, target_engine, target_version, +1 more. Returns: object
aws_user_access_mapAws User Access MapARead-onlyIdempotent
RBAC map from Describe* calls: users x groups x caches. Findings first: ~* +@all users, unattached groups, enabled default user, no-password users in live groups, Memcached groups, caches without a group.
Inputs: region. Returns: object
aws_user_groupsAws User GroupsBRead-onlyIdempotent
DescribeUserGroups: members, attached replication groups/serverless caches, pending changes.
Inputs: region. Returns: object
aws_usersAws UsersARead-onlyIdempotent
DescribeUsers (RBAC): authentication type and access strings, never passwords. Flags users with '~* +@all' access and users without a password.
Inputs: engine, region. Returns: object
memcached_cluster_statsMemcached Cluster StatsARead-onlyIdempotent
Memcached fleet view over MEMCACHED_NODES: every node queried with bounded concurrency, only stats, stats slabs, stats items. Findings first: evictions, hit-ratio outliers, item/memory imbalance,
listen_disabled_num, connections near maxconns, evicting slab classes. A dead node makes it partial.
Inputs: no named parameters. Returns: object
memcached_discoveryMemcached DiscoveryARead-onlyIdempotent
Memcached auto-discovery check: config get cluster (MEMCACHED_HOST or the configuration endpoint) compared
with DescribeCacheClusters nodes. Flags AWS nodes missing from the config, stale entries, engine version
mismatch. An unreachable endpoint is a finding.
Inputs: cache_cluster_id (required), region. Returns: object
memcached_statsMemcached StatsARead-onlyIdempotent
Memcached summary (hit ratio, memory, evictions, connections) or a raw
stats <group> output. Uses MEMCACHED_HOST/MEMCACHED_PORT.
Inputs: group. Returns: object
node_acl_logNode Acl LogARead-onlyIdempotent
ACL WHOAMI and recent ACL LOG entries (auth failures, denied commands, key/channel denials) with reason, user, client address, count; key and channel names hidden. Findings flag repeated auth failures and denial spikes. ACL LIST/GETUSER never used.
Inputs: count. Returns: object
node_clientsNode ClientsCRead-onlyIdempotent
CLIENT LIST aggregated by source IP, client name, ACL user and last command, idle-time stats and the clients holding the most buffer memory.
Inputs: top. Returns: object
node_clients_summaryNode Clients SummaryARead-onlyIdempotent
Who holds the connections: CLIENT LIST grouped by source IP, name or library, user and flags, top IPs, idle over 1h, big buffers, maxclients use. Capped rows per group; never commands, arguments or keys.
Inputs: top, near_maxclients_pct. Returns: object
node_clusterNode ClusterARead-onlyIdempotent
Cluster-mode view: CLUSTER INFO, slots per primary and CLUSTER SHARDS when available. Reports cluster mode disabled otherwise.
Inputs: no named parameters. Returns: object
node_cluster_healthNode Cluster HealthARead-onlyIdempotent
Cluster-mode fan-out: INFO on every node (bounded concurrency, per-node timeout) flagging memory/ops skew across shards, failed nodes, uncovered slots and replica lag.
Inputs: max_workers, per_node_timeout. Returns: object
node_cluster_keyspace_sampleNode Cluster Keyspace SampleARead-onlyIdempotent
node_keyspace_sample on every shard primary: keys merged with a shard label, per-shard status, skew
findings. A dead shard is reported, never fatal. Budget and sample split across primaries.
Inputs: top, match, pause_ms, scan_count, +5 more. Returns: object
node_cluster_memoryNode Cluster MemoryARead-onlyIdempotent
node_memory headline for every shard primary: used/RSS/maxmemory, fragmentation, evictions, with findings for memory skew between shards, shards above 90% of maxmemory and unreachable shards.
Inputs: max_workers, per_node_timeout. Returns: object
node_cluster_nodesNode Cluster NodesARead-onlyIdempotent
CLUSTER NODES parsed into per-shard primary/replica endpoints, slot counts and failing nodes, plus how to target each shard with ELASTICACHE_HOST.
Inputs: no named parameters. Returns: object
node_cluster_slowlogNode Cluster SlowlogARead-onlyIdempotent
node_slowlog on every shard primary: the slowest entries overall labelled by shard, per-command totals and per-shard status. Arguments beyond the key are hidden unless include_args is true.
Inputs: count, max_workers, include_args, per_node_timeout. Returns: object
node_cluster_triageNode Cluster TriageARead-onlyIdempotent
node_triage plus pub/sub pressure on every shard primary under one deadline: one ranked, deduplicated findings list naming node and shard (max 40). A dead shard is a critical finding, never fatal. Use first on a cluster-mode group.
Inputs: max_seconds, max_workers, per_node_timeout. Returns: object
node_commandlogNode CommandlogARead-onlyIdempotent
Valkey 8 COMMANDLOG (slow, large-request, large-reply): oversized payloads SLOWLOG misses. Findings first, top commands by size and client addresses; no arguments or values. Other engines get a note.
Inputs: count. Returns: object
node_commandstatsNode CommandstatsARead-onlyIdempotent
Commands ranked by CPU time (INFO commandstats): calls, usec per call, rejected and failed, error prefixes, p50/p99/p99.9 when available. Findings for OOM/READONLY/NOPERM errors and p99 over 10 ms.
Inputs: top. Returns: object
node_configNode ConfigARead-onlyIdempotent
Allowlisted CONFIG GET view (maxmemory policy, timeout, appendonly, output buffer limits, keyspace notifications, slowlog/latency thresholds, io-threads) with findings. Points at aws_parameters when CONFIG is refused, as ElastiCache usually does.
Inputs: no named parameters. Returns: object
node_connectivityNode ConnectivityARead-onlyIdempotent
Why can't I connect: staged diagnosis of the endpoint, stopping at the first failure. DNS, TCP, TLS (and plaintext fallback), PING, AUTH, each timed with a verdict and one hint per failure class. Socket probes and PING only; credentials never echoed.
Inputs: no named parameters. Returns: object
node_doctorNode DoctorARead-onlyIdempotent
MEMORY DOCTOR and LATENCY DOCTOR of the connected node: the engine's advice plus findings for non-healthy lines. Engines that reject the command get a note, not an error. node_triage includes this.
Inputs: no named parameters. Returns: object
node_healthNode HealthARead-onlyIdempotent
One-shot health summary of the configured Redis/Valkey endpoint: engine and version, role, clients, hit ratio, memory vs maxmemory, fragmentation, evictions and a list of findings.
Inputs: no named parameters. Returns: object
node_hot_slotsNode Hot SlotsARead-onlyIdempotent
Cluster-mode shard skew and hot slots: per-shard keys, memory, ops/sec plus CLUSTER COUNTKEYSINSLOT on a
capped slot sample. Findings name hot shards and slots; reached N/M shards. Counts only.
Inputs: max_seconds, max_workers, slots_per_shard, per_node_timeout. Returns: object
node_infoNode InfoARead-onlyIdempotent
Raw INFO output, optionally for a single section. Password-like keys are masked.
Inputs: section. Returns: object
node_keyspace_sampleNode Keyspace SampleARead-onlyIdempotent
Big keys, hot (LFU) or cold keys, type mix, TTL coverage, per-prefix bytes from a bounded SCAN. Metadata only, never values. partial=true at max_seconds. Cluster mode: this node only (see node_cluster_keyspace_sample). include_access adds the idle-key share; include_sizes flags large collections.
Inputs: top, match, pause_ms, scan_count, +6 more. Returns: object
node_latencyNode LatencyARead-onlyIdempotent
Client PING RTT percentiles, LATENCY LATEST events (needs latency-monitor-threshold > 0) and per-command p50/p99/p99.9 from LATENCY HISTOGRAM (Redis 7+/Valkey) with findings for heavy tails.
Inputs: ping_samples. Returns: object
node_latency_eventsNode Latency EventsCRead-onlyIdempotent
LATENCY LATEST, then HISTORY for the 3 worst events, findings first: fork or aof-fsync over 100 ms, expire-cycle spikes, trimmed LATENCY/MEMORY DOCTOR. With latency-monitor-threshold 0 the finding names it.
Inputs: no named parameters. Returns: object
node_memoryNode MemoryARead-onlyIdempotent
Memory breakdown: used/RSS/peak/dataset/overhead, maxmemory and policy, fragmentation ratio with a verdict, evictions, MEMORY STATS and MEMORY DOCTOR when the engine allows them.
Inputs: no named parameters. Returns: object
node_pubsubNode PubsubARead-onlyIdempotent
Pub/Sub pressure: channel and pattern counts, top channels by subscribers, subscribers with large output buffers. Counts only, never messages. Cluster mode aggregates shard primaries.
Inputs: top, pattern, max_workers, per_node_timeout. Returns: object
node_replicationNode ReplicationARead-onlyIdempotent
Replication role, replicas with byte lag, link status, backlog, plus findings: links down, lagging replicas (also vs the primary offset on a replica), replica-read-only, min-replicas-to-write, cluster-allow-reads- when-down. Engine quirks are notes, not errors.
Inputs: no named parameters. Returns: object
node_slowlogNode SlowlogARead-onlyIdempotent
SLOWLOG entries plus per-command totals. Arguments beyond the key are hidden unless include_args is true.
Inputs: count, include_args. Returns: object
node_triageNode TriageARead-onlyIdempotent
On-call snapshot of the connected endpoint: health, memory, replication, clients, failed commandstats, top-5 slowlog, latency, DOCTOR. Findings worst-first (max 30); a failing section is reported unavailable. Start here.
Inputs: no named parameters. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 65 tools
The aws_*/node_*/node_cluster_*/memcached_* prefixes give a useful first cut, but several tools have genuinely overlapping scope: node_clients vs node_clients_summary both aggregate CLIENT LIST, node_latency_events vs node_latency both read LATENCY, and the findings-first roll-ups (aws_triage, aws_cluster_overview, aws_shard_balance, aws_scale_readiness, aws_capacity_forecast, aws_metrics) all draw on CloudWatch and would tempt misselection. Descriptions do disambiguate most of these if read carefully, but an agent scanning names alone would hesitate in several places.
Consistent snake_case throughout with a clear scope-prefix convention (aws_ for control plane, node_ for data plane, node_cluster_ for cluster fan-out, memcached_ for Memcached). The only real deviation is the noun/verb style drift where a plain tool and a _summary variant coexist (node_clients vs node_clients_summary), which is a minor blemish rather than a pattern break.
65 tools is well past the point of a well-scoped surface, and the breadth of the domain (control plane, data plane, cluster mode, serverless, Memcached, RBAC, cost, security) does not fully justify it. Multiple aggregate/diagnostic roll-ups restate each other's findings, so a meaningful fraction of the tools do not independently earn their place.
Coverage is unusually deep: control-plane inventory, node diagnostics, cluster-mode fan-out, serverless, Memcached, RBAC mapping, snapshots/restore readiness, upgrade and failover pre-flight, cost and security audits are all present with few dead ends. The only consistent gap is that the surface is entirely read-only — no config changes, failover, resharding, or scaling actions — which is a defensible design choice for a diagnostics server but leaves remediation workflows to other tooling.
Maintenance
Related MCP Connectors
Read-only AI coding tools for change verification, release readiness, capacity, and guidance.
Read-only server insight: why a Linux server or K8s cluster is slow, failing or changed.
Read-only local AI advice, shared reports and website audits. No PC scan or local actions.
AI SRE: investigate production incidents across your observability stack.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to monitor and troubleshoot AWS Application Signals services by tracking service health, analyzing SLO compliance, querying CloudWatch metrics, and investigating issues using distributed tracing with AWS X-Ray.MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to query AWS CloudWatch metrics, alarms, and logs read-only via MCP, providing rapid health snapshots and triage without console navigation.1MIT
- AlicenseBqualityBmaintenanceEnables AI assistants to perform comprehensive read-only diagnostics of VMware ESXi hosts, covering CPU Ready, disk latency, snapshots, datastore usage, hardware health, events, and performance history. It guarantees no write operations, helping users identify bottlenecks and infrastructure issues safely.1328 PyPIMIT
- AlicenseNot gradedqualityBmaintenanceEnables read-only investigation of support cases with an agent by querying OpenSearch, CloudWatch Logs Insights, and MySQL under cost and read-only guards, while providing a live local viewer, resumable sessions, and shared technical memory across investigations.MIT