MCP server for natural language management of home media server stacks
Project description
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.sh)
This installs arr-helper 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
A read-only 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. Useful for household members who just want to see if things are running.
Features
| Category | Tools |
|---|---|
| Containers | list, start, stop, restart, remove, logs, stats |
| Stacks | up, down, pull, restart, validate (via arr-helper) |
| 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 |
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-helper (host process) ← podman-compose, systemctl, quadlets
│ Unix socket (bind-mounted into arr-mcp)
▼
arr-mcp container
arr-helper 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 |
changeme |
Bearer token — change this |
ARR_MCP_PORT |
8081 |
HTTP listen port |
ARR_MCP_STACKS_DIR |
/opt/stacks |
Compose stack root |
ARR_MCP_MEDIA_DIR |
/media-server |
Media storage root |
ARR_MCP_CONTAINER_RUNTIME |
auto |
auto / podman / docker |
ARR_MCP_SOCKET_PATH |
`` | Explicit runtime socket path (required in containers) |
ARR_MCP_HELPER_SOCKET |
/run/arr-helper/arr-helper.sock |
arr-helper socket path |
ARR_MCP_DASHBOARD_PUBLIC |
false |
Skip dashboard auth (for LAN-only deployments) |
ARR_MCP_PUBLIC_URL |
`` | Public URL shown in the "Open in Claude" button |
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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file arr_mcp_server-0.2.0.tar.gz.
File metadata
- Download URL: arr_mcp_server-0.2.0.tar.gz
- Upload date:
- Size: 155.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
14e1263768fa34792dc7bfeb765c47ea2e6a2dee0a28f5e6ea8e55b7320ec68e
|
|
| MD5 |
95d0f7a4877c61e9dcf4209ea4310198
|
|
| BLAKE2b-256 |
6c4d4cee58da16c82e072d4cfcdf65652c0bf9c895c23922a54587a47538d45c
|
Provenance
The following attestation bundles were made for arr_mcp_server-0.2.0.tar.gz:
Publisher:
ci.yaml on ryanbrinn/arr-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
arr_mcp_server-0.2.0.tar.gz -
Subject digest:
14e1263768fa34792dc7bfeb765c47ea2e6a2dee0a28f5e6ea8e55b7320ec68e - Sigstore transparency entry: 1714376507
- Sigstore integration time:
-
Permalink:
ryanbrinn/arr-mcp@633f9648984db7d497cf5698b2aa2026416f05b4 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/ryanbrinn
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yaml@633f9648984db7d497cf5698b2aa2026416f05b4 -
Trigger Event:
push
-
Statement type:
File details
Details for the file arr_mcp_server-0.2.0-py3-none-any.whl.
File metadata
- Download URL: arr_mcp_server-0.2.0-py3-none-any.whl
- Upload date:
- Size: 34.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bd0ff3b060af1b84746dfa436666ccd400f4f34bffe340fd7bf7678aef9eed74
|
|
| MD5 |
b01de5a7586abbfb0aad5142f51dbd6e
|
|
| BLAKE2b-256 |
d7e0bacf320557c7fd479d503d31c1f85cd50b6da98ca8762698f7baeea4e83a
|
Provenance
The following attestation bundles were made for arr_mcp_server-0.2.0-py3-none-any.whl:
Publisher:
ci.yaml on ryanbrinn/arr-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
arr_mcp_server-0.2.0-py3-none-any.whl -
Subject digest:
bd0ff3b060af1b84746dfa436666ccd400f4f34bffe340fd7bf7678aef9eed74 - Sigstore transparency entry: 1714376595
- Sigstore integration time:
-
Permalink:
ryanbrinn/arr-mcp@633f9648984db7d497cf5698b2aa2026416f05b4 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/ryanbrinn
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yaml@633f9648984db7d497cf5698b2aa2026416f05b4 -
Trigger Event:
push
-
Statement type: