{
  "markdown": "# yarr\n\nSelf-hosted media fleet operations across Sonarr, Radarr, Plex, and related apps over MCP and CLI.\n\nIf you run Claude Code, Codex, or Gemini CLI against a self-hosted media stack,\n`yarr` gives an agent one consistent way to query and control all of it instead\nof eleven different ad hoc integrations. It is an upstream-client MCP server:\nit does not replace those applications or mirror every REST endpoint as a web\nUI. Its job is to provide one consistent tool surface for agents and one\nequivalent CLI surface for operators.\n\n**Not for:** a general-purpose REST gateway to arbitrary services, or a\nscheduler/automation engine in its own right. `yarr` only talks to the service\nkinds it knows about, and only does what you or your agent ask it to do.\n\n## Contents\n\n- [Naming](#naming)\n- [Capabilities And Boundaries](#capabilities-and-boundaries)\n- [Install](#install)\n- [Unraid Plugin](#unraid-plugin)\n- [Quickstart](#quickstart)\n- [Client Configuration](#client-configuration)\n- [Runtime Surfaces](#runtime-surfaces)\n- [MCP Tool Reference](#mcp-tool-reference)\n- [CLI Reference](#cli-reference)\n- [Configuration](#configuration)\n- [Authentication](#authentication)\n- [Safety And Trust Model](#safety-and-trust-model)\n- [Architecture](#architecture)\n- [Distribution Contract](#distribution-contract)\n- [Development](#development)\n- [Verification](#verification)\n- [Deployment](#deployment)\n- [Troubleshooting](#troubleshooting)\n- [Related Servers](#related-servers)\n- [Documentation](#documentation)\n- [License](#license)\n\n## Naming\n\nThis repository is published at `github.com/dinglebear-ai/yarr`.\n\nThe Rust package and installed binary are both `yarr`. The npm launcher package\nis `yarr-mcp` because the shorter `yarr` name is occupied on npm; installing the\nlauncher still gives you a `yarr` command. The MCP registry name is\n`ai.dinglebear/yarr`, and Docker images use `ghcr.io/dinglebear-ai/yarr`.\nProduction Compose deployments select that image by immutable manifest digest.\n\nPlugin naming is intentionally split:\n\n- `yarr` is the full MCP server plugin. It launches the repository-coupled\n  `@dinglebear/yarr` npm package over stdio and includes every per-service fallback\n  skill; it does not commit a platform-specific binary.\n- `sonarr`, `radarr`, `prowlarr`, `overseerr`, `sabnzbd`, `qbittorrent`, `plex`,\n  `jellyfin`, `tautulli`, `tracearr`, and `bazarr` are skills-only plugins with\n  no MCP server and no bundled binary.\n\n## Capabilities And Boundaries\n\n`yarr` wraps a configured media automation fleet through one action-dispatched\nservice layer. The same implementation backs MCP and CLI calls, so behavior\ndoes not drift between \"agent used the tool\" and \"operator ran the command.\"\n\nPrimary capabilities:\n\n- Fleet status checks across the configured services.\n- Credentialed upstream API passthrough for known service kinds.\n- Table-driven OpenAPI operation metadata for Sonarr, Radarr, Prowlarr,\n  Overseerr, Jellyfin, and Plex. The executor preserves the declared parameter,\n  request-media, and successful-response transport contract; unsupported rows\n  are excluded and listed in the generated\n  [capability matrix](https://github.com/dinglebear-ai/yarr/blob/main/docs/TOOLS_ACTIONS_ENDPOINTS.md#generated-operations-spec-backed-services).\n- Curated commands for SABnzbd, qBittorrent, Tautulli, Bazarr, and Tracearr,\n  whose upstreams do not ship usable machine-readable specs.\n- Code Mode over MCP for multi-step media automation scripts.\n- Snippet storage and execution for repeatable Code Mode workflows.\n- Skills-only direct-HTTP plugin fallbacks for each individual service.\n\nBoundaries:\n\n- `yarr` does not store or schedule media jobs on its own.\n- It does not expose a local REST action API or embedded web UI.\n- It does not accept arbitrary unknown service kinds.\n- MCP callers never provide credentials, tokens, keys, or secrets as action\n  arguments. Credentials come from environment variables, config files, or\n  strict per-service plugin config JSON.\n\n## Install\n\nThe native release installer is the safest default because it verifies the\nrelease archive and SHA-256 before installing `yarr` into `~/.local/bin`:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/dinglebear-ai/yarr/main/install.sh | bash\nyarr --version\n```\n\nThe npm launcher is a coupled distribution, not an alias for whatever version\nhappens to be tagged `latest`. Verify the exact release version exists on npm\nbefore using it:\n\n```bash\nYARR_VERSION=2.1.0\nnpm view \"@dinglebear/yarr@${YARR_VERSION}\" version\nnpx -y \"@dinglebear/yarr@${YARR_VERSION}\" mcp\n# Or, after the same availability check:\nnpm i -g \"@dinglebear/yarr@${YARR_VERSION}\"\n```\n\nNever use an unpinned `npx @dinglebear/yarr` or `@latest` in an MCP manifest: npm may\nstill point at an older launcher after a partial release. At the time of this\ndocumentation refresh, GitHub release `v2.1.0` is public but\n`@dinglebear/yarr@2.1.0` is not yet available on npm; recovery is tracked in\n[issue #80](https://github.com/dinglebear-ai/yarr/issues/80). Use the native\ninstaller, a verified release archive, a source build, or the independent\nUnraid package until the exact npm version resolves.\n\n## Unraid Plugin\n\nThe coordinated Unraid distribution lives under\n[`unraid-plugin/`](https://github.com/dinglebear-ai/yarr/tree/main/unraid-plugin). It combines the classic `.plg`\ninstaller and privileged service lifecycle, an external NestJS GraphQL\nextension, and Vue settings/dashboard custom elements.\n\nInstall the plugin URL from Unraid's **Plugins > Install Plugin** page:\n\n```text\nhttps://raw.githubusercontent.com/dinglebear-ai/yarr/main/unraid-plugin/yarr.plg\n```\n\nFresh installs bind Yarr to loopback. LAN or custom-address binding is rejected\nuntil authentication is configured; Tailscale Serve is the supported\ntailnet-only option. Service credentials stay in server-side boot\nconfiguration and are never returned to the browser. See the\n[Unraid operator and release guide](https://github.com/dinglebear-ai/yarr/blob/main/unraid-plugin/README.md) for persistence,\ndiscovery, updates, rollback, uninstall retention, troubleshooting, and\nrelease gates.\n\n## Quickstart\n\nThe first-screen 30-second path is:\n\n```bash\nexport YARR_SERVICES=sonarr\nexport YARR_SONARR_URL=http://127.0.0.1:8989\nexport YARR_SONARR_API_KEY=...\n\nyarr sonarr status\nyarr mcp\n```\n\nThen point an MCP client at the stdio command:\n\n```json\n{\n  \"mcpServers\": {\n    \"yarr\": {\n      \"command\": \"yarr\",\n      \"args\": [\"mcp\"],\n      \"env\": {\n        \"YARR_SERVICES\": \"sonarr\",\n        \"YARR_SONARR_URL\": \"http://127.0.0.1:8989\",\n        \"YARR_SONARR_API_KEY\": \"${YARR_SONARR_API_KEY}\"\n      }\n    }\n  }\n}\n```\n\nFor Claude Code plugin installs, use the marketplace commands inside a Claude\nCode chat session, not in a shell:\n\n```text\n/plugin marketplace add dinglebear-ai/yarr\n/plugin install yarr@yarr\n```\n\nThe full plugin starts the exact launcher pinned in its manifest. Confirm that\nversion exists before installing or debugging the plugin:\n\n```bash\nnpm view @dinglebear/yarr@2.1.0 version\n```\n\nUntil issue #80 is resolved, the full plugin cannot start from npm. The\nservice-specific skills-only plugins do not depend on that launcher and remain\navailable for direct upstream workflows.\n\nInstall one skills-only plugin when you want direct service scripts without the\nMCP server:\n\n```text\n/plugin install sonarr@yarr\n/plugin install plex@yarr\n```\n\n## Client Configuration\n\n### stdio\n\nstdio is the preferred local MCP transport. It starts `yarr mcp` on demand and\ndoes not require binding a local HTTP port.\n\n```json\n{\n  \"mcpServers\": {\n    \"yarr\": {\n      \"command\": \"yarr\",\n      \"args\": [\"mcp\"],\n      \"env\": {\n        \"RUST_LOG\": \"info,yarr=debug\"\n      }\n    }\n  }\n}\n```\n\n### Streamable HTTP\n\nRun a persistent server when several clients or machines should share one MCP\nendpoint:\n\n```bash\nYARR_MCP_TOKEN=change-me yarr serve\n```\n\n```json\n{\n  \"mcpServers\": {\n    \"yarr\": {\n      \"url\": \"http://127.0.0.1:40070/mcp\",\n      \"headers\": {\n        \"Authorization\": \"Bearer ${YARR_MCP_TOKEN}\"\n      }\n    }\n  }\n}\n```\n\nHTTP MCP initialization smoke call:\n\n```bash\ncurl --fail http://127.0.0.1:40070/mcp \\\n  -H \"Authorization: Bearer $YARR_MCP_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Accept: application/json, text/event-stream\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2025-11-25\",\"capabilities\":{},\"clientInfo\":{\"name\":\"curl-smoke\",\"version\":\"1\"}}}'\n```\n\nUse an MCP client such as mcporter for session-aware `tools/list` and Code Mode\ncalls; a raw one-shot `tools/call` is not a complete MCP session.\n\n## Runtime Surfaces\n\n| Surface | Status | Purpose |\n|---|---:|---|\n| MCP | Required | One default `yarr` Code Mode tool over the whole fleet |\n| CLI | Required | Scriptable parity surface for debugging and automation |\n| REST | Not shipped | Upstream-client servers do not expose a local REST action API |\n| Web | Core: not shipped | The core server has no embedded UI; the classic Unraid distribution ships a separate settings/dashboard web surface |\n\nSet `YARR_MCP_TOOL_MODE=flat` to advertise one action-dispatched MCP tool per\nconfigured service instead of the single Code Mode tool. That mode is useful\nbehind a gateway such as Labby that already provides its own discovery and\nsandbox layer. `codemode` is the default and the right choice for standalone\nMCP clients.\n\n## MCP Tool Reference\n\nBy default, MCP exposes one tool named `yarr`.\n\n| Field | Type | Required | Notes |\n|---|---|---:|---|\n| `code` | string | yes | JavaScript async arrow function executed in the in-process Code Mode sandbox |\n\nInside Code Mode, scripts can use:\n\n- Per-service callables such as `sonarr.get_series()`,\n  `radarr.post_movie({ body })`, `prowlarr.get_indexer()`, and\n  `plex.get_sessions()`.\n- Curated commands such as `qbittorrent.download_queue()` and\n  `tautulli.stats_activity()`.\n- Raw passthrough helpers at `api.<service>.get/post/put/delete(path, body)`.\n- `callTool(action, params)` for the underlying action-dispatch escape hatch.\n- `codemode.search(query)` and `codemode.describe(path)` for discovery.\n- `codemode.run(name, input)`, `codemode.snippets()`, and `writeArtifact(...)`\n  for reusable scripts and artifacts.\n\nGenerated callables come from metadata tables. They preserve method/path,\nrequired path arguments, known query names, JSON-body presence, and a bounded\nsingle-file multipart escape hatch. They do not enforce every required query,\nheader/cookie parameter, style/explode rule, form schema, media type, or\nresponse schema. See `docs/API.md` before relying on a generated operation for\na non-JSON or serialization-sensitive endpoint.\n\nExample:\n\n```js\nasync () => {\n  const queue = await radarr.get_queue();\n  await radarr.post_command({\n    body: { name: \"MoviesSearch\", movieIds: [456] }\n  });\n  return { queued: queue.records?.length };\n}\n```\n\n### Generic Actions\n\nThese actions work for every configured service kind:\n\n| Action | Scope | CLI | Description |\n|---|---|---|---|\n| `service_status` | `yarr:read` | `yarr <service> status` | Fetch an upstream service status endpoint |\n| `api_get` | `yarr:write` | `yarr <service> get --path <path>` | Proxy a credentialed GET request |\n| `api_post` | `yarr:write` | `yarr <service> post --path <path> --body <json>` | Proxy a POST request |\n| `api_put` | `yarr:write` | `yarr <service> put --path <path> --body <json>` | Proxy a PUT request |\n| `api_delete` | `yarr:write` | `yarr <service> delete --path <path>` | Proxy a DELETE request |\n| `help` | public | `yarr help` | Return action reference |\n\n### Code Mode Actions\n\n| Action | Scope | Surface | Description |\n|---|---|---|---|\n| `codemode` | `yarr:write` | `yarr` tool / `yarr codemode --code <JS>` | Run a JS arrow function over the fleet |\n| `op` | `yarr:write` | `<service>.<operation>()` / `yarr <service> op <name>` | Dispatch a generated OpenAPI operation |\n| `snippet_list` | `yarr:read` | `yarr snippet list` / `codemode.snippets()` | List saved snippets |\n| `snippet_save` | `yarr:write` | `yarr snippet save` | Save a reusable snippet |\n| `snippet_run` | `yarr:write` | `yarr snippet run` / `codemode.run(name, input)` | Run a saved snippet |\n| `snippet_delete` | `yarr:write` | `yarr snippet delete` | Delete a saved snippet |\n\nThere is no `confirm` argument. CLI destructive commands dispatch immediately.\nMCP direct and nested Code Mode destructive calls require elicitation and fail\nclosed if the peer cannot elicit or approval is not granted.\n\n## CLI Reference\n\nThe CLI is service-grouped:\n\n```bash\nyarr help\nyarr radarr status\nyarr sonarr get --path /api/v3/system/status\nyarr radarr post --path /api/v3/command --body '{\"name\":\"RefreshMovie\"}'\nyarr sonarr put --path /api/v3/series/editor --body '{\"seriesIds\":[1],\"qualityProfileId\":4}'\nyarr radarr delete --path /api/v3/movie/12\n\n# Generated operations for spec-backed services.\nyarr sonarr op get_series\nyarr radarr op post_command --args '{\"body\":{\"name\":\"MoviesSearch\",\"movieIds\":[456]}}'\n\n# Curated commands for doc-only services.\nyarr qbittorrent queue\nyarr tautulli activity\n\n# Code Mode and snippets.\nyarr codemode --code 'async () => sonarr.get_system_status()'\nyarr snippet list\n```\n\nThere is no `--service` flag. Infra commands such as `help`, `codemode`, and\n`snippet` are service-less.\n\n## Configuration\n\nCopy `.env.example` or use `config.example.toml` as a starting point. Common\nenvironment variables:\n\n```bash\nYARR_MCP_HOST=127.0.0.1\nYARR_MCP_PORT=40070\nYARR_MCP_TOKEN=change-me\n\nYARR_SERVICES=sonarr,radarr,prowlarr,tautulli,overseerr,bazarr,tracearr,sabnzbd,qbittorrent,plex,jellyfin\nYARR_SONARR_URL=http://sonarr:8989\nYARR_SONARR_API_KEY=...\nYARR_RADARR_URL=http://radarr:7878\nYARR_RADARR_API_KEY=...\nYARR_QBITTORRENT_URL=http://qbittorrent:8080\nYARR_QBITTORRENT_USERNAME=...\nYARR_QBITTORRENT_PASSWORD=...\nYARR_PLEX_URL=http://plex:32400\nYARR_PLEX_TOKEN=...\n```\n\nSupported service kinds are `sonarr`, `radarr`, `prowlarr`, `tautulli`,\n`overseerr`, `bazarr`, `tracearr`, `sabnzbd`, `qbittorrent`, `plex`, and\n`jellyfin`.\n\n`*_API_KEY` covers most Arr-style services. qBittorrent uses username/password\nlogin. Plex and Jellyfin token headers are handled separately.\n\n`YARR_MCP_TOOL_MODE=codemode` is the default. Use\n`YARR_MCP_TOOL_MODE=flat` only when a gateway should see separate per-service\ntools.\n\n## Authentication\n\n`YARR_MCP_TOKEN` authenticates `/mcp` on any HTTP bind, including loopback.\nIt receives the scopes in `YARR_MCP_STATIC_TOKEN_SCOPES`, which defaults to\nread-only `yarr:read`. A read-only bearer deployment must use\n`YARR_MCP_TOOL_MODE=flat`; using the default Code Mode surface requires an\nexplicit `yarr:write` scope. On `127.0.0.1` or `localhost` with no explicit\nbearer/OAuth configuration, auth is bypassed for local development.\n\nAuth states:\n\n| State | Condition | Behavior |\n|---|---|---|\n| `LoopbackDev` | loopback bind with no explicit auth, or explicit loopback no-auth | no auth, no scopes |\n| `TrustedGatewayUnscoped` | `YARR_NOAUTH=true` behind a trusted gateway | no local auth or scopes |\n| `Mounted` bearer | any HTTP bind with `YARR_MCP_TOKEN` | bearer auth with configured static-token scopes |\n| `Mounted` OAuth | `YARR_MCP_AUTH_MODE=oauth` on any HTTP bind | OAuth/JWT auth plus optional bearer |\n\nUnauthenticated health endpoints are `/health`, `/ready`, `/status`, and\n`/metrics`. `/status` redacts secrets; `/metrics` exposes HTTP and bounded\ndomain metrics and should be network-restricted when needed.\n\n## Safety And Trust Model\n\nSecrets stay server-side. MCP clients provide action parameters, never upstream\ntokens. Query-string secrets such as `apikey=`, `token=`, and `X-Plex-Token`\nare rejected by path validation.\n\n`help` is public at the action layer, but mounted HTTP transports still require\nbearer or OAuth transport auth. `service_status` requires `yarr:read`.\nCredentialed passthrough, generated operations, curated write operations, and\nCode Mode require `yarr:write`; write satisfies read.\n\nGenerated DELETE operations, `api_delete`, `download_remove`,\n`stats_delete_image_cache`, and `trace_terminate_stream` are destructive. CLI\ncommands dispatch them immediately. MCP callers get an interactive elicitation\nprompt at the actual dispatch point, including inside Code Mode, with no call\nargument or nested `callTool` path that can skip it.\n\nResponses are capped by the shared token-limit layer before they are returned to\nMCP clients.\n\n## Architecture\n\n```text\nMCP shim (src/mcp/tools.rs)   CLI shim (src/cli.rs)\n  JSON args -> dispatch          argv -> dispatch\n        \\                          /\n         execute_service_action (src/actions/dispatch.rs)\n             shared validation + curated-command dispatch\n                          |\n         YarrService (src/app.rs + src/app/*.rs)\n           validation, service lookup, response shaping\n                          |\n         YarrClient (src/yarr.rs)\n           network calls and auth headers\n```\n\n`src/mcp.rs` and `src/cli.rs` are thin facades re-exporting their own\nsubmodules. `execute_service_action` makes CLI-to-MCP parity structural rather\nthan something kept in sync by hand.\n\nThe service layer owns:\n\n- supported service catalog and config lookup\n- safe path validation\n- credential redaction\n- qBittorrent login flow\n- response normalization\n\n## Distribution Contract\n\nThe source of truth for release identity is the version shared by `Cargo.toml`,\n`Cargo.lock`, `xtask/Cargo.toml`, `.release-please-manifest.json`,\n`packages/yarr-mcp/package.json`, and `server.json`.\n\nGenerated code and docs must be regenerated from the committed source inputs,\nnot patched by hand:\n\n- Generated OpenAPI operations live under `src/openapi/generated/` and come\n  from vendored specs in `specs/`.\n- Curated actions live in the handwritten action registries and docs.\n- Plugin manifests stay versionless; marketplaces derive plugin version from\n  the git commit SHA.\n- The npm package version and the GitHub Release tag must match.\n- `server.json` must name the exact `yarr-mcp` npm version and stdio launch\n  contract under the `ai.dinglebear/yarr` registry identity.\n- The Docker image path is `ghcr.io/dinglebear-ai/yarr`; production deployment uses a\n  promoted immutable `@sha256:` digest.\n\n## Development\n\n```bash\ncargo run -- help\ncargo fmt --check\ncargo test\ncargo clippy -- -D warnings\ncargo build --release\n```\n\nWhen changing generated operations:\n\n```bash\ncargo xtask gen-openapi\ncargo xtask tool-docs\ncargo test --test parity\n```\n\nWhen changing plugin packaging:\n\n```bash\ncargo test --test plugin_contract\ncargo test --test template_invariants\n```\n\n## Verification\n\nUse the README guide checker before landing documentation changes:\n\n```bash\npython3 /home/jmagar/workspace/soma/scripts/check-readme-guide.py README.md\n```\n\nUse the package and Rust checks for distribution-sensitive work:\n\n```bash\nnpm --prefix packages/yarr-mcp run check\ncargo fmt --check\ncargo check\ncargo test\ngit diff --check\n```\n\nFor live install verification, validate the native installer and only exercise\nthe npm path after the exact coupled version resolves:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/dinglebear-ai/yarr/main/install.sh | bash\nyarr --version\n\nYARR_VERSION=2.1.0\nnpm view \"@dinglebear/yarr@${YARR_VERSION}\" version\nnpx -y \"@dinglebear/yarr@${YARR_VERSION}\" mcp\n```\n\nDocumentation changes also require the repository-local link and anchor guard:\n\n```bash\npython3 scripts/check-doc-links.py\n```\n\n## Deployment\n\nRun as a persistent HTTP MCP server:\n\n```bash\nYARR_MCP_HOST=0.0.0.0 \\\nYARR_MCP_PORT=40070 \\\nYARR_MCP_TOKEN=change-me \\\nYARR_MCP_STATIC_TOKEN_SCOPES=yarr:read \\\nYARR_MCP_TOOL_MODE=flat \\\nyarr serve\n```\n\nDocker Compose deployments are covered by `docker-compose.yml`,\n`docker-compose.prod.yml`, `docs/DOCKER.md`, and `docs/DEPLOYMENT.md`.\nProduction deployments should put `yarr` behind a trusted reverse proxy or MCP\ngateway when exposed outside loopback.\n\n## Troubleshooting\n\n- `401` or `403` from HTTP MCP: confirm `YARR_MCP_TOKEN`, OAuth mode, and\n  gateway headers.\n- `unknown service`: confirm the service is listed in `YARR_SERVICES` and has a\n  matching `YARR_<SERVICE>_URL`.\n- upstream `401`: confirm the service-specific API key or token in the server\n  environment, not in tool arguments.\n- `query-string secret rejected`: remove tokens from `--path` and put them in\n  config.\n- plugin skill cannot reach a service: its per-service config JSON under\n  `~/.config/lab-<service>/config.json` is missing or stale. It is written by the\n  plugin's `SessionStart` / `ConfigChange` hook, so start a new session (or change\n  a plugin setting) to refresh it. To rebuild it by hand, export the settings\n  yourself — the scripts read `CLAUDE_PLUGIN_OPTION_*`, which only the hook sets:\n\n  ```bash\n  CLAUDE_PLUGIN_OPTION_SONARR_URL=https://sonarr.example.com \\\n  CLAUDE_PLUGIN_OPTION_SONARR_API_KEY=… \\\n    bash plugins/sonarr/scripts/setup.sh\n  ```\n\n  Skill scripts run through the Bash tool, which receives **no**\n  `CLAUDE_PLUGIN_OPTION_*` variables — only hook processes do. That is why these\n  plugins need the hook: it is the one channel that can carry a `sensitive: true`\n  value to a skill, since sensitive values are never substituted into skill prose\n  and these plugins have no MCP server to receive an `${user_config.*}` env block.\n- Code Mode cannot find a callable: use `codemode.search(...)` and\n  `codemode.describe(...)`; generated names follow upstream OpenAPI operation\n  IDs after normalization.\n- `npm` or the full plugin reports `E404`/`ETARGET`: check the exact pinned\n  launcher with `npm view @dinglebear/yarr@2.1.0 version`. Do not fall back to unpinned\n  `latest`; use the native binary while issue #80 is open.\n\n## Related Servers\n\n- [soma](https://github.com/dinglebear-ai/soma) - RMCP runtime for provider-backed MCP servers.\n- [unifi-rmcp](https://github.com/dinglebear-ai/runifi) - UniFi controller REST API bridge.\n- [tailscale-rmcp](https://github.com/dinglebear-ai/rtailscale) - Tailscale API bridge for devices, users, and tailnet operations.\n- [unraid-rmcp](https://github.com/dinglebear-ai/runraid) - Unraid GraphQL bridge for NAS and server management.\n- [apprise-rmcp](https://github.com/dinglebear-ai/rapprise) - Apprise notification fan-out bridge for many delivery backends.\n- [gotify-rmcp](https://github.com/dinglebear-ai/rgotify) - Gotify push notification bridge for sends, messages, apps, and clients.\n- [arcane-rmcp](https://github.com/dinglebear-ai/rarcane) - Arcane Docker management bridge for containers and related resources.\n- [ytdl-rmcp](https://github.com/dinglebear-ai/rytdl) - Media download and metadata workflow server.\n- [synapse-rmcp](https://github.com/dinglebear-ai/synapse) - Local Synapse workflow server for scout and flux actions.\n- [cortex](https://github.com/dinglebear-ai/cortex) - Syslog and homelab log aggregation MCP server.\n- [axon](https://github.com/dinglebear-ai/axon) - RAG, crawl, scrape, extract, and semantic search project.\n- [labby](https://github.com/dinglebear-ai/labby) - Homelab control plane and MCP gateway project.\n- [lumen](https://github.com/jmagar/lumen) - Local semantic code search MCP server.\n\n## Documentation\n\nThe source of truth docs split is:\n\n- `docs/README.md` is the audience-oriented documentation index.\n- `docs/DOCS.md` defines authority, generated-doc rules, freshness checks, and\n  where new documentation belongs.\n- `docs/API.md` covers action contracts and Code Mode call shape.\n- `docs/CONFIG.md`, `docs/ENV.md`, and `docs/AUTH.md` cover configuration,\n  environment variables, auth states, and tool modes.\n- `docs/QUICKSTART.md` covers native, source, exact-version npm, and Unraid\n  first-run paths.\n- `docs/MCP_SCHEMA.md` and `docs/TOOLS_ACTIONS_ENDPOINTS.md` are checked\n  schema/action references.\n- `docs/DEPLOYMENT.md`, `docs/DOCKER.md`, and `docs/SYSTEMD.md` cover production\n  runtime choices.\n- `docs/CI.md`, `docs/SCRIPTS.md`, and `docs/runbooks/` cover validation,\n  releases, incidents, and rollback.\n- `docs/PATTERNS.md` holds conventions shared across the RMCP server family.\n- `docs/PLUGINS.md`, `plugins/README.md`, and `plugins/yarr/README.md` cover\n  marketplace packaging and launcher availability.\n- `unraid-plugin/README.md` is the operator, API, recovery, verification, and\n  release guide for the classic Unraid distribution.\n- `CLAUDE.md` holds repo-local agent memory and the \"How to add an action\"\n  checklist.\n\n## License\n\nOriginal Dinglebear-authored portions of this project are licensed under [AGPL-3.0-only](LICENSE). Separate commercial licensing is available for organizations that need terms outside the AGPL. Third-party material remains under its original license. See [LICENSING.md](https://github.com/dinglebear-ai/yarr/blob/main/LICENSING.md).\n",
  "bytes": 24748,
  "sha": "4456c891b8b936299003aec8e935fc1e8822fa5e8d7e3e789a61d07d2ae28eaa",
  "repo_slug": "dinglebear-ai/yarr",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_ai_dinglebear_yarr_9b6dfcd3/readme"
}