arr-mcp
MCP server for natural language management of a home media server stack — Plex, Sonarr, Radarr, SABnzbd, and more — via Podman or Docker.
Talk to your media server through Claude instead of SSH. Ask it to restart a stuck container, check disk usage, pull the latest images for a stack, or migrate a compose file to Podman quadlets. A read-only status dashboard is also included for household members who don't need Claude.
AI Disclosure
This project was co-authored with Claude (Anthropic). The architecture, code, and documentation were developed collaboratively. All code has been reviewed by the author and is maintained as a human-owned open source project.
Quick start
The easiest way to install on a Podman (rootless) server — run this as your service account:
bash <(curl -sSL https://raw.githubusercontent.com/ryanbrinn/arr-mcp/main/scripts/install/install.sh)
This installs arr-agent on the host, generates a quadlet for arr-mcp, and starts both services. It asks five questions (media directory, API key, etc.) and takes about a minute.
Requirements: rootless Podman, uv, active systemd user session (sudo loginctl enable-linger $(whoami)).
For Docker or manual setup, see the Getting Started guide.
What it does
Talk to your server through Claude
Connect arr-mcp to Claude as an MCP server and manage your stack conversationally:
"Restart the radarr container"
"How much disk space is left on /media-server?"
"Pull the latest images for my media stack and bring it back up"
"Convert my compose.yaml to quadlet files"
Status dashboard
An authenticated dashboard is served at http://your-server:8081/ — no Claude required. Shows container status, disk usage, and stack health with auto-refresh every 30 seconds. Household members sign in with a local account or Plex to view status and manage their media interests.
Features
| Category | Tools |
|---|---|
| Containers | list, start, stop, restart, remove, logs, stats |
| Stacks | up, down, pull, restart, validate (via arr-agent) |
| Compose files | read, write, validate |
| Conversion | compose → quadlets, quadlets → compose |
| Filesystem | disk usage, directory list, file read, write, delete |
| Logs | tail and search any log file |
| Services | health checks, API reachability, diagnostics, version tracking |
| Media | watched-content cleanup, per-user interest states |
| Credentials | encrypted credential store for service API keys |
| Alerts | configurable threshold alerts with polling |
| Security | session auth, rate limiting, security headers, PBKDF2 encryption |
All filesystem operations are ownership-scoped — arr-mcp cannot touch files owned by root or other users. See Security.
Architecture
Claude / Browser
│
▼
arr-mcp (container) ← MCP tools + dashboard
│ Podman socket
▼
Container runtime ← your media stack
arr-agent (host process) ← podman-compose, systemctl, quadlets
│ Unix socket (bind-mounted into arr-mcp)
▼
arr-mcp container
arr-agent is a small host-side process that gives arr-mcp access to podman-compose, systemctl --user, and quadlet files — things that aren't available from inside a container. The install script sets it up automatically.
Connecting to Claude
Claude.ai
Go to Settings → Integrations and add a remote MCP server:
URL: http://your-server-ip:8081/mcp
Header: Authorization: Bearer your-api-key
Claude Desktop
Claude Desktop requires a local bridge. Install mcpproxy on your local machine, then add to claude_desktop_config.json:
{
"mcpServers": {
"arr-mcp": {
"command": "/usr/local/bin/mcpproxy",
"args": [
"--transport", "streamablehttp",
"-H", "Authorization", "Bearer your-api-key",
"http://your-server-ip:8081/mcp"
]
}
}
}
Configuration
| Variable | Default | Description |
|---|---|---|
ARR_MCP_API_KEY |
`` | Bearer token — required (server refuses to start if empty or changeme) |
ARR_MCP_PORT |
8081 |
HTTP listen port |
ARR_MCP_SERVICES_DIR |
/media-server |
Root directory where arr services live (configs, logs, data) — read-only |
ARR_MCP_MEDIA_DIR |
/media-server/library |
Root directory of your media library |
ARR_MCP_COMPOSE_DIR |
`` | Root directory for Docker Compose projects — required for docker-compose runtime |
ARR_MCP_CONTAINER_RUNTIME |
docker-compose |
docker-compose / docker / podman / auto |
ARR_MCP_SOCKET_PATH |
`` | Explicit runtime socket path (required in containers) |
ARR_MCP_HELPER_SOCKET |
/run/arr-agent/arr-agent.sock |
arr-agent socket path |
ARR_MCP_SESSION_SECRET |
`` | Secret for signing session cookies — required |
ARR_MCP_ADMIN_USERS |
`` | Comma-separated usernames granted admin on first login |
ARR_MCP_LOG_LEVEL |
info |
debug / info / warning / error |
Full reference: docs/configuration.
Supported runtimes
| Configuration | Supported |
|---|---|
| Docker Engine | ✅ |
| Docker with Docker Compose | ✅ |
| Podman (rootless) with Quadlets | ✅ |
| Podman (rooted) | ❌ |
Documentation
Contributing
git clone https://github.com/ryanbrinn/arr-mcp
cd arr-mcp
uv sync --extra dev
uv run pytest
See CLAUDE.md for development guidelines.
License
MIT
Metadata
Release files for arr-mcp-server 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| arr_mcp_server-0.4.0.tar.gz | 495.1 kB | With provenance | Details for arr_mcp_server-0.4.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| arr_mcp_server-0.4.0-py3-none-any.whl | Python 3 | none | any | Details for arr_mcp_server-0.4.0-py3-none-any.whl |
Total release size: 767.9 kB
Release files / arr_mcp_server-0.4.0.tar.gz
| Download URL | arr_mcp_server-0.4.0.tar.gz |
|---|---|
| Size | 495.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e2700ea4bf821ea28db59a1eefc4a34cde6056a8d18503db044427f90a0e26cf
|
|
BLAKE2b-256 checksum How to use checksums |
c49fb665c3b21a8910649915ef4d201518845e955ea7a5bd9bc0da71c7d52f52
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 22, 2026.
Transparency logRelease files / arr_mcp_server-0.4.0-py3-none-any.whl
| Download URL | arr_mcp_server-0.4.0-py3-none-any.whl |
|---|---|
| Size | 272.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4efc41eac09576eec764add386e585038d78536b39d5084d5f4c4df78420dc67
|
|
BLAKE2b-256 checksum How to use checksums |
2a6a2643799a4afc135f5eb9e689054907340f7d2970b0d151f9a25f6bb0d775
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 22, 2026.
Transparency logSecurity for arr-mcp-server 0.4.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for arr_mcp_server-0.4.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 22, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.