mcpField
O
Oraclarr

Oraclarr

ローカル
github.comゲーム・エンタメ02 週間前に更新

Oraclarr について

Oraclarrは、自宅などで *arr メディアスタックを運用する人向けのローカル MCP サーバーです。メディア、ダウンロード、ホスト、コンテナの診断情報をまとめ、変更操作は既定で無効です。

主な機能

  1. 01複数サービスの状態確認
  2. 02メディア処理の診断と検索
  3. 03ダウンロードキューと履歴の確認
  4. 04ホスト、コンテナ、ログの調査
  5. 05任意の更新、再スキャン、検索、リネーム

活用シーン

  1. 01エピソードが未ダウンロードの理由を調査
  2. 02サービスの状態と空き容量を確認
  3. 03リリースが選ばれた理由を確認
  4. 04実行中または失敗したメディアジョブを追跡

MCP 対応

HTTP または stdio で、診断結果を中心とするツールを MCP クライアントに提供します。書き込み保護を有効にした場合のみ、`start_job`で指定操作を実行できます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"bdog720-oraclarr": {
"command": "uvx",
"args": [
"oraclarr-mcp"
],
"env": {
"ORACLARR_SONARR_URL": "<ORACLARR_SONARR_URL>",
"ORACLARR_SONARR_API_KEY": "<ORACLARR_SONARR_API_KEY>",
"ORACLARR_RADARR_URL": "<ORACLARR_RADARR_URL>",
"ORACLARR_RADARR_API_KEY": "<ORACLARR_RADARR_API_KEY>",
"ORACLARR_CONFIG": "<ORACLARR_CONFIG>"
}
}
}
}
起動コマンドuvx oraclarr-mcp
設定が必要な環境変数
ORACLARR_SONARR_URLSonarr base URL, e.g. http://192.168.1.10:8989. Every service is ORACLARR_<NAME>_URL plus ORACLARR_<NAME>_API_KEY; the README lists the types.
ORACLARR_SONARR_API_KEYシークレットSonarr API key (Settings > General).
ORACLARR_RADARR_URLRadarr base URL, e.g. http://192.168.1.10:7878.
ORACLARR_RADARR_API_KEYシークレットRadarr API key (Settings > General).
ORACLARR_CONFIGOptional path to a config.yaml as an alternative to ORACLARR_* variables. See docs/config-file.md in the repository.

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypioraclarr-mcp2.0.2

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

Oraclarr

メディアスタックの状況を、自然な言葉で質問できます。

ローカルで実行する MCP サーバーです。LLM クライアント(Claude Code、Claude Desktop)を使って、セルフホストの *arr メディアスタックを診断できます。デフォルトでは読み取りのみです。書き込みはオプトインで、トークンが必要です。

License Python MCP Mode Status


できること

Oraclarr を使うと、通常なら6つのウェブ UI を切り替えて調べる必要がある運用上の「なぜ」という質問に、言語モデルが一か所で答えられます。サービス全体から情報を集約し、何も変更せずに、構造化された単一の回答を返します。オプトインで使えるツール start_job は、更新、再スキャン、検索、名前変更を開始できます。書き込みを参照してください。

現在対応しているのは、Sonarr、Radarr、Sportarr、Prowlarr、qBittorrent、Tdarr、Profilarr、Jellyfin、Cleanuparr、Netdata、TrueNAS、Docker です。同じ種類の複数のインスタンス(たとえば、アニメ用または4K用の別個の Sonarr/Radarr)にも対応しています。各ツールは、定義したすべてのインスタンスに対して処理を実行し、それぞれの結果を個別に報告します。

実際の使い方

接続したら、質問するだけです。Oraclarr が適切なツールを選び、回答します。

質問の例Oraclarr が実行するツール回答の内容
「スタック内で停止しているものはありますか?」stack_health到達不能または異常なサービス、ディスク空き容量が少ないサービス、さらに停止中のサービスについてはコンテナーの状態と終了コード
「X の新しいエピソードがまだダウンロードされていないのはなぜですか?」diagnoseX がライブラリにあるか、ダウンロードキューに入っているか、または未取得リストに残っているか
「英語吹き替え版だけを許可しているのに、字幕のみのリリースが取得されたのはなぜですか?」explain_decision取得されたリリース、そのカスタムフォーマットのスコア、一致した言語フォーマット
「このダウンロードを Cleanuparr が削除しようとしているのはなぜですか?」get_queues + get_cleanupそのダウンロードに対する警告とその種類、削除対象としてマークされているかどうか、適用されるルール
「このマシンは I/O 負荷が高いですか? 実際に使える RAM はどれくらいですか?」get_hostCPU 使用率と I/O 待ち、I/O 負荷、空きメモリと使用可能メモリ、スワップ、最大値に対する ARC、GPU の温度と VRAM
「今日 Sonarr が記録したエラーは何ですか?」get_containersコンテナーのログから、タイムスタンプ付きの該当ログ行
「Sonarr の名前変更処理はまだ実行中ですか?」get_jobs実行中および待機中のコマンドと進行状況、対象の番組、さらに失敗したコマンド

ツール

デフォルトでは読み取り専用で、エンドポイントごとにツールを用意するのではなく、結果を重視しています。これにより、モデルの精度を保てます。書き込みを有効にした場合に限り、start_job が書き込みを行います。

ツール回答する内容
stack_healthダウンしているもの、不健全なもの、ディスク容量が不足しているものはありますか?
get_queuesアクティブなダウンロードの統合状況(arr キュー ↔ qBittorrent)、停滞状況
diagnoseX はパイプラインのどこにありますか/まだここにないのはなぜですか?
explain_decisionX が取得された、またはアップグレード中なのはなぜですか?(プロファイル、カスタムフォーマット、取得履歴)
get_quality_config品質プロファイル、カスタムフォーマット、リリースプロファイル、Profilarr の同期状態
get_history最近の取得/インポート/失敗
get_wanted不足しているもの/カットオフ未達のものは何ですか?
search_mediaX はありますか、その状態はどうですか?
get_indexersエラーが発生しているインデクサーはどれですか?
get_transcodesトランスコード中または停止中のものは何ですか?
get_upcoming近日中に放送または公開されるものは何ですか、取得できそうですか?(最大 90 日先まで)
get_libraryJellyfin のライブラリ、スキャンの進行状況、タスク、再生とトランスコード、最近の追加、名前検索
get_cleanupCleanuparr のドライラン状態、クリーナーのスケジュール、シードと停滞のルール、違反回数
get_hostホストの CPU/iowait、メモリ、スワップ、ARC、GPU、プール、データセット、ディスク温度、TrueNAS のアラート
get_containersDocker コンテナ:状態、ヘルス、再起動回数、終了コード、フィルター済みログ末尾
get_jobsarr と Jellyfin が実行中、キュー待ち、失敗、またはスケジュール済みの処理
start_job1 つのシリーズまたは映画の更新、再スキャン、検索、名前変更、または Jellyfin のスキャンを開始します(オプトイン、2 段階)

インストール

実行方法は 2 つあります。どちらかを選んでください。

  • 🐳 Docker(推奨)。 arr スタックの隣で常時稼働する小さなコンテナです。Dockge、Portainer、Unraid、および通常の docker compose で動作します。
  • 🐍 Python(uv)。 コンテナを使わず、マシン上で直接実行します。ローカル開発や Docker を使わない場合に便利です。

どちらの方法でも、すべての設定は ORACLARR_ で始まる環境変数です。Docker の場合は、compose ファイルと同じ場所に .env ファイルを 1 つ用意します。Dockge と Portainer では、どちらもエディターに表示されます。.env.example を基にしてください。設定 にすべての変数が記載されています。.env がコミットされることはありません。

オプション A:Docker(推奨)

Oraclarr は長時間稼働するコンテナとして動作し、http://<host>:7979/mcp で HTTP 経由の MCP を提供します。同じフォルダーに docker-compose.yml と .env の 2 つのファイルが必要です。

スタックマネージャー(Dockge、Portainer など)を使用する場合: 新しいスタックを作成し、以下の compose をエディターに貼り付け、設定をスタックの .env に貼り付けます。デプロイを実行します。Portainer はウェブエディターの変数を stack.env として保存するため、Portainer では compose の行を env_file: stack.env に変更してください。

コマンドラインを使用する場合:

cp docker-compose.example.yml docker-compose.yml
cp .env.example .env    # then fill in your URLs and keys
docker compose up -d

これが compose ファイルの全体です。サービスを追加または削除するときに編集する必要はありません。サービスの追加や削除は .env で行います。

services:
  oraclarr:
    image: ghcr.io/bdog720/oraclarr-mcp:latest
    container_name: oraclarr
    restart: unless-stopped
    ports:
      - "7979:7979"           # left side is the host port; change it if 7979 is taken
    env_file: .env

コンテナの状態とログも必要ですか(get_containers)? 代わりに docker-compose.full.example.yml を使用してください。読み取り専用の Docker ソケットプロキシが追加されます。これは同じスタック内で稼働させる必要があるサイドカーです。コンテナ で説明しています。

次に、クライアントを接続してください。Claude Code にはコマンドを 1 つ、Claude Desktop、Cursor、Codex、VS Code、Gemini CLI、Windsurf には短い JSON ブロックを使用します。

オプション B:Python(uv)

Docker を使わずに Oraclarr を直接実行します。Python 3.12 以降と uv が必要です。

パッケージは PyPI で oraclarr-mcp として公開されています。MCP over stdio で通信するため、クライアントがプロセスを起動し、設定を env ブロックに渡します。

"oraclarr": {
  "command": "uvx",
  "args": ["oraclarr-mcp"],
  "env": {
    "ORACLARR_SONARR_URL": "http://192.168.1.10:8989",
    "ORACLARR_SONARR_API_KEY": "your-key",
    "ORACLARR_RADARR_URL": "http://192.168.1.10:7878",
    "ORACLARR_RADARR_API_KEY": "your-key"
  }
}

クローンから実行する場合(開発用): 同じ ORACLARR_* の行をリポジトリフォルダー内の .env に記述します(起動時に読み込まれます)。その後、次を実行します。

uv sync
uv run python -m oraclarr_mcp

クライアントの設定では、"command": "uv"、"args": ["run", "python", "-m", "oraclarr_mcp"] を指定し、"cwd" はリポジトリを指すようにします。

設定

各サービスは、任意の名前を付けた インスタンス です。設定は ORACLARR_<NAME>_<FIELD> という名前の変数で指定し、_URL を設定するとインスタンスが作成されます。

ORACLARR_SONARR_URL=http://192.168.1.10:8989
ORACLARR_SONARR_API_KEY=your-key

ORACLARR_SONARR_ANIME_TYPE=sonarr           # a second Sonarr, named sonarr-anime
ORACLARR_SONARR_ANIME_URL=http://192.168.1.10:8990
ORACLARR_SONARR_ANIME_API_KEY=your-key

ORACLARR_QBITTORRENT_URL=http://192.168.1.10:8080
ORACLARR_QBITTORRENT_USERNAME=admin
ORACLARR_QBITTORRENT_PASSWORD=your-password
フィールド必要なサービス
_URLすべてのインスタンス
_TYPE名前がサービスの種類と異なる場合のみ。種類:sonarr、radarr、sportarr、prowlarr、qbittorrent、tdarr、profilarr、jellyfin、cleanuparr、netdata、truenas、docker
_API_KEYSonarr、Radarr、Sportarr、Prowlarr、Profilarr、Jellyfin、Cleanuparr、TrueNAS
_USERNAME、_PASSWORDqBittorrent
_ENABLED任意。false にすると、行を削除せずにインスタンスを無効にします
_VERIFY_TLS任意。false にすると、自己署名証明書を受け入れます(TrueNAS)
_ALLOW_WRITES任意。true にすると、このインスタンスで start_job を実行できます。書き込み を参照してください

名前のアンダースコアはインスタンス名ではハイフンに変わるため、SONARR_ANIME は sonarr-anime として表示されます。空の値は未設定として扱われるため、使用していないサービスの行を残しておけます。ORACLARR_ 変数のスペルを間違えると、後でひっそり失敗するのではなく、その変数名を示すメッセージとともにコンテナが停止します。

Jellyfin には API キーが必要です(Dashboard → API Keys)。Cleanuparr にはアカウントの API キーが必要です(Settings → Account → API Key)。TrueNAS、Netdata、Docker にはそれぞれ簡単なセットアップガイドがあり、以下からリンクされています。

サーバー設定は任意です。

変数デフォルト説明
ORACLARR_TOOLSETSmedia,downloads,transcode,library,host,containers提供するツールのグループ
ORACLARR_TOOL_BUDGET_SECONDS30ツール呼び出しごとの制限時間。応答の遅いインスタンスは status: "timeout" を返します
ORACLARR_MAX_OUTPUT_BYTES200000過大な応答を防ぐための上限
ORACLARR_TIMEOUT_SECONDS10サービスへの各リクエストのタイムアウト
ORACLARR_ALLOW_WRITESfalsestart_job を有効にします。各インスタンスでも個別に _ALLOW_WRITES=true を設定する必要があります
ORACLARR_HTTP_TOKEN未設定24 文字以上。設定すると、すべての HTTP リクエストに Authorization: Bearer <token> が必要です。http 経由で書き込みを有効にするには必須です

すべてのツール呼び出しには時間制限があります。インスタンスが制限時間内に応答しない場合は status: "timeout" が返され、ほかのインスタンスからは引き続きデータが返されます。リスト結果には有用なフィールドのみが含まれ、各ツールの limit で打ち切られます。結果がさらにある場合は、truncated と total でそのことが示されます。API キーとパスワードは、応答とログ行では *** と表示されます。

ガイド

  • クライアントの接続:Claude Code、Claude Desktop、Cursor、Codex CLI、VS Code、Gemini CLI、Windsurf、トークンヘッダー、クラウドコネクターを使用しない理由について説明します。
  • ホストのメトリクス:get_host 用の TrueNAS 読み取り専用ユーザーと Netdata コンテナについて説明します。
  • コンテナ:get_containers 用の Docker ソケットプロキシと、そこを通過できるものについて説明します。
  • 書き込み操作:2 つのスイッチ、トークン、2 段階の計画フロー、監査ログについて説明します。
  • 設定ファイル:.env の代わりに(または併用して)config.yaml を使用する方法と、そこから移行する方法について説明します。
  • アップグレード:特定のバージョンを超えてアップグレードする際に変更すべき内容について説明します。

ロードマップ

Oraclarr は段階的に構築されています。デフォルトでは読み取り専用で、明示的な安全対策のもとで書き込み機能が追加されます。型付きクライアント+結果ツール+設定で選択可能なツールセットというアーキテクチャは、*arr 以外のセルフホスト型スイートにも拡張できるよう設計されています。

  • ✅ フェーズ 1:読み取り専用の診断。 Sonarr、Radarr、Sportarr、Prowlarr、qBittorrent、Tdarr、Profilarr、Jellyfin、Cleanuparr、TrueNAS、Netdata、Docker。
  • 🔜 フェーズ 2:サービスを追加し、引き続き読み取り専用。 Seerr、Gluetun、Unpackerr、ntfy。アーキテクチャは *arr 以外のスタックにも対応します。
  • 🚧 フェーズ 3:安全な書き込み操作。 2.0.0 で start_job(更新、再スキャン、検索、名前変更、Jellyfin のスキャン)から開始しました。2 つのスイッチ、トークン、ドライランのプレビュー、監査ログによって制限されています。再試行とリクエスト承認は後日追加されます。
  • 🔭 フェーズ 4:破壊的な操作。 メディアの削除、ブロックリストへの追加、スタックの制御、Cleanuparr の変更を、明示的な確認と許可リストのもとで行います。

対応してほしいサービスはありますか?Issue を作成してください。

💬 フィードバックと問題の報告

バグを見つけた場合や機能をリクエストしたい場合は、GitHub でIssue を作成してください。

🤝 コントリビューション

Issue と PR を歓迎します。コードベース全体で TDD を採用しています。

uv run pytest        # tests (respx-mocked, no live services needed)
uv run ruff check .  # lint

サービスの追加は簡単な手順で行えます(新しいクライアントを作成 → type で登録 → ツールを拡張 → テストを作成)。src/oraclarr_mcp/ のプロジェクト構成を参照してください。

📄 ライセンス

Apache License 2.0。LICENSE を参照してください。

💖 プロジェクトを支援する

Oraclarr によって、何かがダウンロードされなかった理由を調べるために 6 つの Web UI を切り替える手間が省けたなら、コーヒーをごちそうしていただけると幸いです。

コーヒーをごちそうしてください

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。