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/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

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.4.0.tar.gz (495.1 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.4.0-py3-none-any.whl (272.8 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: arr_mcp_server-0.4.0.tar.gz
  • Upload date:
  • Size: 495.1 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.4.0.tar.gz
Algorithm Hash digest
SHA256 e2700ea4bf821ea28db59a1eefc4a34cde6056a8d18503db044427f90a0e26cf
MD5 ff5d6a8c53b78c391d05da6325f35d87
BLAKE2b-256 c49fb665c3b21a8910649915ef4d201518845e955ea7a5bd9bc0da71c7d52f52

See more details on using hashes here.

Provenance

The following attestation bundles were made for arr_mcp_server-0.4.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.4.0-py3-none-any.whl.

File metadata

  • Download URL: arr_mcp_server-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 272.8 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.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4efc41eac09576eec764add386e585038d78536b39d5084d5f4c4df78420dc67
MD5 fb5c6384e295c83f810d0b0ae2fff61f
BLAKE2b-256 2a6a2643799a4afc135f5eb9e689054907340f7d2970b0d151f9a25f6bb0d775

See more details on using hashes here.

Provenance

The following attestation bundles were made for arr_mcp_server-0.4.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