Skip to main content

MCP server for natural language management of home media server stacks

Project description

arr-mcp

Version License CI

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

arr_mcp_server-0.1.0.tar.gz (150.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

arr_mcp_server-0.1.0-py3-none-any.whl (32.3 kB view details)

Uploaded Python 3

File details

Details for the file arr_mcp_server-0.1.0.tar.gz.

File metadata

  • Download URL: arr_mcp_server-0.1.0.tar.gz
  • Upload date:
  • Size: 150.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arr_mcp_server-0.1.0.tar.gz
Algorithm Hash digest
SHA256 8f84efcdbe50d3c097a305f9e7c21b771d739820f2506d9537263cae83ac804e
MD5 4f2614e43115b2d5bccbc3bf9b590d59
BLAKE2b-256 91e22d5dd4fa2415240c6eda556920b1b4d8920913a9a69def709238c36acb4b

See more details on using hashes here.

Provenance

The following attestation bundles were made for arr_mcp_server-0.1.0.tar.gz:

Publisher: ci.yaml on ryanbrinn/arr-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file arr_mcp_server-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: arr_mcp_server-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 32.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arr_mcp_server-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ea92fb657ebc0d61ada858c498f48dba0771d6eec35ab44a6ff423b5cf038336
MD5 5464f4e7ef3143ff07d6d585ae259df9
BLAKE2b-256 a729afdb07e1b33d5164654f6b490fac944553d84d1c4a82c8f4add88f0f861c

See more details on using hashes here.

Provenance

The following attestation bundles were made for arr_mcp_server-0.1.0-py3-none-any.whl:

Publisher: ci.yaml on ryanbrinn/arr-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page