queue-inspector-mcp
Queue-Inspector-MCP is an MCP server that lets an AI agent inspect and operate Redis-backed job queues (Asynq and BullMQ) through a structured interface.
List queues (
list_queues): Discover all queues in Redis, tagged with their backend (asynq or bullmq).Get queue statistics (
queue_stats): See job counts per state for a given queue, using each backend's native state names (e.g.,pending/archivedfor Asynq;waiting/failedfor BullMQ).Browse jobs by state (
list_jobs): Page through jobs in a specific state, with id, type, attempt count, and a truncated last error.Inspect a specific job (
get_job): Retrieve full details for a single job — payload (base64-encoded if binary), attempt count, retry ceiling, last error, and timestamps.Retry a failed job (
retry_job, mutating): Move a failed or dead job back to the pending/wait queue, replicating each backend's own retry logic.Delete a job (
delete_job, mutating): Permanently remove a job from a queue (active jobs cannot be deleted).Read-only mode: Use
--read-onlyorQUEUE_INSPECTOR_READ_ONLY=1to disable mutating tools (retry_job,delete_job) for production safety.The
backendargument is optional when the queue name is unique across both backends.
Provides tools for inspecting and operating Redis-backed job queues, supporting Asynq and BullMQ backends, including listing queues, viewing job details, and retrying/deleting jobs.
Click on "Install 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., "@queue-inspector-mcpList all queues with job counts"
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.
queue-inspector-mcp
An MCP server that lets an agent inspect and operate Redis-backed job queues. It speaks to two backends today, Asynq (Go) and BullMQ (Node), reporting per-state counts, individual job detail, and moving jobs between states.
Background: I wrote up the design decisions behind this — why jobs, not keys, and the read-only posture — on my blog.
Architecture
---
config:
look: handDrawn
---
flowchart LR
A["AI agent"] -->|"MCP · stdio"| M["queue-inspector-mcp"]
M --> B1["Asynq adapter<br/>protobuf msg"]
M --> B2["BullMQ adapter<br/>state by zset"]
B1 -->|ioredis| R[("Redis")]
B2 -->|ioredis| R
M -.->|"--read-only<br/>drops mutating tools"| G{{"prod-safe"}}The server speaks MCP over stdio to the agent and talks to Redis through per-backend adapters that understand each library's on-disk layout — Asynq's protobuf task messages and BullMQ's state-by-membership sorted sets — instead of treating Redis as a bag of keys.
Related MCP server: A2AMCP
Why
When a queue misbehaves in production, the useful questions are about jobs, not keys: how many tasks are stuck in retry, what error a specific job failed with, how many attempts it has left, whether a dead job can be requeued. A plain Redis MCP server can only show you keys and raw values; it does not know that an Asynq task message is protobuf, that a BullMQ job's state is decided by which sorted set it sits in, or how either library moves a job back to the front of the line. This server encodes that knowledge so an agent can reason about queue state and take safe, state-aware actions.
Install
Requires Node.js 18 or newer and a reachable Redis.
npm install -g queue-inspector-mcp
# or run without installing:
npx queue-inspector-mcpConfigure
The server talks MCP over stdio, so it works with any MCP client. Point your
client at the queue-inspector-mcp binary and set REDIS_URL.
Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"queues": {
"command": "npx",
"args": ["-y", "queue-inspector-mcp"],
"env": { "REDIS_URL": "redis://localhost:6379" }
}
}
}Claude Code (project .mcp.json, or claude mcp add):
{
"mcpServers": {
"queues": {
"command": "npx",
"args": ["-y", "queue-inspector-mcp"],
"env": { "REDIS_URL": "redis://localhost:6379", "QUEUE_INSPECTOR_READ_ONLY": "1" }
}
}
}Configuration
Variable | Default | Purpose |
|
| Redis connection string. Include a database number, e.g. |
|
| Key prefix Asynq was configured with. |
|
| Key prefix BullMQ was configured with. |
|
| Restrict which backends are scanned. |
| unset | Set to |
Tools
Tool | Mutating | Behavior |
| no | List every detected queue, tagged with its backend. |
| no | Count jobs per state for a queue, using the backend's own state names. |
| no | Page through jobs in one state; returns id, type, attempts, and a truncated last error. |
| no | Full detail for one job: payload, attempts, retry ceiling, last error, timestamps. |
| yes | Move a failed or dead job back to pending/wait so it runs again. |
| yes | Permanently delete a job. Active jobs are refused. |
When a queue name is unique across the enabled backends, the backend argument
is optional; the server resolves it. If the same name exists in both backends,
pass backend explicitly.
Read-only mode
With --read-only or QUEUE_INSPECTOR_READ_ONLY=1, the server never registers
retry_job or delete_job. The mutating tools are absent from tools/list
entirely, so a client cannot call them by mistake. This is the recommended
configuration for pointing an agent at a production database.
Backend state names
The two libraries model job lifecycles differently, so this server does not invent a shared vocabulary. It reports each backend's own state names, and each state maps to a specific Redis structure.
A job moves through these states over its lifetime (Asynq shown):
---
config:
look: handDrawn
---
stateDiagram-v2
[*] --> pending: enqueue
pending --> active: worker picks up
active --> completed: success
active --> retry: handler error
retry --> active: backoff elapsed
retry --> archived: retries exhausted
archived --> pending: retry_job
completed --> [*]Asynq:
State | Meaning | Redis structure |
| Ready to run, waiting for a worker | list |
| Currently being processed | list |
| Enqueued for a future time | zset |
| Failed, waiting to be retried | zset |
| Retries exhausted (the "dead" state) | zset |
| Finished, kept for its retention window | zset |
BullMQ:
State | Meaning | Redis structure |
| Ready to run | list |
| Currently being processed | list |
| Scheduled for a future time | zset |
| Waiting, ordered by priority | zset |
| Blocked on child jobs (flows) | zset |
| Held while the queue is paused | list |
| Finished successfully | zset |
| Failed after exhausting attempts | zset |
Asynq's archived is what most people mean by a "dead" job. list_jobs returns
Asynq's terminal sets in Redis (score) order and BullMQ's completed/failed
sets most-recent-first.
What this doesn't do
Only Asynq and BullMQ are supported. Sidekiq, Celery, RQ and others are not.
No web UI. This is an MCP server for programmatic use; it is not a dashboard.
No streaming or watch. Each tool call is a point-in-time read; there is no subscription to queue events.
retry_jobanddelete_jobfaithfully replicate each library's own mechanism rather than reimplementing it. Retry runs Asynq'sInspector.RunTaskscript and BullMQ'sJob.retry(reprocessJob) script; delete runs Asynq'sInspector.DeleteTaskscript and BullMQ'sJob.remove(removeJob) script. As a result the semantics match the libraries: retrying a BullMQ job applies only tofailed/completedjobs and does not resetattemptsMade(matchingJob.retry()); neither backend can retry or delete anactivejob.delete_jobremoves a single BullMQ job and does not cascade into a flow's children.Asynq group aggregation (the
aggregatingstate) is not surfaced in this release.
License
MIT © Yusuf İhsan Görgel
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Yusufihsangorgel/queue-inspector-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server