
Seerr Mcp Server
io.github.cyanheadsPublished by GitHub account cyanheadsv0.2.0Updated Oct 29, 2026
Search Jellyseerr/Overseerr, check availability, and create guarded media requests.
Overview
Connects an assistant to a Jellyseerr/Overseerr instance to search movies and TV, check availability, and submit guarded media requests.
- What you can do
- Search movies and TV titles by name and get ranked TMDB matches with availability
- Fetch exact title details by TMDB ID, including per-season summaries and episode lists
- List recent requests with status, type and requester filters
- Preview and submit media requests for Radarr or Sonarr, with confirmation before writing
- Read a single request's status, routing and next-step guidance
- Summarize configured Radarr/Sonarr services, quality profiles and instance capabilities
- When to use it
- Useful when you run Jellyseerr or Overseerr and want an assistant to find titles, check whether they are already available or requested, and file requests without leaving the chat. It suits home-media setups where requests should still follow the instance's own permissions, quotas and routing.
- Requirements
- A local runtime: Node.js v24+ (npx) or Bun v1.4.0+. A reachable Jellyseerr/Overseerr instance and its API key, set as SEERR_BASE_URL and SEERR_API_KEY (sent as the X-Api-Key header). Optional HTTP transport settings such as MCP_TRANSPORT_TYPE, MCP_HTTP_PORT and MCP_AUTH_MODE.
Installation
In SourceWeft
- Open Seerr Mcp Server in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
@cyanheads/seerr-mcp-server
Search Jellyseerr/Overseerr, check availability, and create guarded media requests via MCP. STDIO or Streamable HTTP.
Overview
Request movies and shows through Jellyseerr or Overseerr. Search titles, confirm the exact match, check availability and request status, and submit a request for Radarr or Sonarr to fulfill. Your Seerr instance keeps control of permissions, quotas, and routing.
Tools
Resources
All request data is also reachable via tools — request enumeration is the job of seerr_list_requests (the tool-only access path).
Skills
Capability reference
seerr_search_media tool
- Search titles with
mediaType: movie | tv | all; people are excluded.pageis 1–1000;limitis 1–20, default 10. - Returns TMDB matches and decoded
status/status4kfor tracked titles. Empty results return[]with a guidance notice. - Optional ISO 639-1
languageselects localized titles and overviews.
seerr_get_media tool
- Availability plus any existing open request for the title (avoids duplicate requests)
- TV: omit
seasonNumberfor a per-season summary, or pass one to fetch that season's episode list (season 0 is Specials) - A TMDB ID that doesn't resolve surfaces as a typed
media_not_foundwith a search-recovery hint (Jellyseerr's raw HTTP 500 is classified in the service layer)
seerr_list_requests tool
- Filter by lifecycle
filter,mediaType, andrequestedById; sort byaddedormodified, ascending or descending.takeis 1–100, default 20;skipselects the offset. - Returns decoded statuses, requester
{ id, displayName }, and an enrichment trailer with applied filters. includeTitles: truejoins media titles once per distinct title (default off); unresolved rows retain their data and are disclosed in the notice.
seerr_request_media tool
- Guarded write.
mode: preview(default) returns the resolved title and exactPOST /requestpayload without writing.mode: requestasks for confirmation bound to the same caller, title and payload; declined, cancelled or invalid answers returnrequest_cancelled. - TV requests require
seasons: "all"or a list such as[1, 2]; season 0 (Specials) requires special episodes to be enabled. Instance capability checks run before any POST; existing requests appear in output and duplicate rejections returnduplicate_request. - Optional routing overrides:
serverId,profileId,rootFolder,languageProfileId. Omit them to use Jellyseerr's defaults.
seerr_request_status tool
- Accepts
requestIdfromseerr_request_media'screated.requestIdorseerr_list_requests. A missing request returnsrequest_not_found. - Returns decoded
requestStatus,mediaStatus/mediaStatus4k, requester{ id, displayName }, routing (serverId,profileName,is4k), andstateGuidance. - Joins
titleon each call; it is absent when notmdbIdexists or the lookup fails.
seerr_service_options tool
- Returns instance version, media server, capability flags (
movie4kEnabled,series4kEnabled,partialRequestsEnabled,specialEpisodesEnabled), and service IDs, defaults and quality profiles. - Failed service legs retain the available results with a notice.
includePaths: trueexposes root-folder paths and free space; both are omitted by default.
seerr://request/{requestId} resource
- Accepts
requestIdfromseerr_request_mediaorseerr_list_requests; a missing request returnsrequest_not_found. - Mirrors
seerr_request_status, including redaction and a title join.titleis absent when notmdbIdexists or the lookup fails; resources take no per-read options.
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
HTTP requires stateful sessions for 2025-era confirmation rounds; explicit MCP_SESSION_MODE=stateless fails startup. Consent records expire after ten minutes and changed or replayed records ask again. Redemption excludes concurrent retries in one process; request creation makes one POST attempt without automatic retries. Cross-instance read-and-delete is not atomic: use shared strongly consistent filesystem, Supabase or Cloudflare D1 storage for routed retries, and account for duplicate-submission races; Cloudflare KV is unsuitable for consent records.
Seerr-specific:
- Read + guarded-request only — admin-scope endpoints (approve/decline, retry, edit/delete, media/file deletion, user/settings/sync) are excluded by design, not by API limitation
- PII/infra redaction centralized in one normalizer choke point — requesters project to
{ id, displayName }; operator email, Plex/Jellyfin tokens, andserviceUrlnever reach output; filesystem paths are opt-in viaincludePaths - Status decoding centralized in one helper — request and media statuses (including the separate 4K availability) decode to
{ raw, label }everywhere, forward-compatible with new Jellyseerr status codes - Capability validation against cached instance settings catches most bad requests before they reach the API
- A short-TTL settings cache avoids a round-trip on every preview
Agent-friendly output:
- Provenance and disclosure — searches echo the effective query; capped lists disclose truncation; a degraded service leg surfaces a notice instead of silently dropping data
- Typed, actionable errors —
media_not_found,request_not_found,seasons_required,four_k_not_enabled,duplicate_request, and more carry a recovery hint so callers can branch and retry without parsing prose
Getting started
Add the following to your MCP client configuration file, pointing SEERR_BASE_URL at your own Jellyseerr or Overseerr instance and supplying its API key.
Or with npx (no Bun required):
For Streamable HTTP, set the transport and start the server:
Prerequisites
- Bun v1.4.0 or higher (or Node.js v24+).
- A running Jellyseerr or Overseerr instance, and its API key (Settings → General → API Key).
Installation
- Clone the repository:
- Navigate into the directory:
- Install dependencies:
- Configure environment:
Configuration
All configuration is validated at startup via Zod schemas in src/config/server-config.ts. Key environment variables:
See .env.example for the full list of optional overrides.
Running the server
Local development
-
Build and run:
-
Run checks and tests:
Docker
The Dockerfile defaults to HTTP transport, stateful session mode, and logs to /var/log/seerr-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
Development guide
See CLAUDE.md/AGENTS.md for development guidelines and architectural rules. The short version:
- Handlers throw, framework catches — no
try/catchin tool logic - Use
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storage - Register new tools and resources via the barrels in
src/mcp-server/*/definitions/index.ts - Wrap the Jellyseerr API: validate raw → normalize and redact to a domain type → return the output schema; never fabricate missing fields, and never let operator PII or paths reach output
Contributing
Issues are welcome. Run checks and tests before submitting:
License
Apache-2.0 — see LICENSE for details.
Source: README.md at commit ebf32a1
Tools
0Version history
4- v0.2.0LatestOct 29, 2026
- v0.1.5Oct 7, 2026
- v0.1.4Sep 21, 2026
- v0.1.3Sep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts