Skip to main content
Glama

Seerr MCP Server

License: MIT Docker Version PayPal

A Model Context Protocol (MCP) server for Overseerr and Seerr (the unified successor) that enables AI assistants to search, request, and manage media through the Model Context Protocol.

🎯 Key Features

  • 🚀 99% fewer API calls for batch operations (150-300 → 1)

  • ⚡ 88% token reduction with compact response formats

  • 🎯 Batch Dedupe Mode - Check 50-100 titles in one operation

  • 🔄 Smart Caching - 70-85% API call reduction

  • 🛡️ Safety Features - Multi-season confirmation, validation

  • 📦 6 Tools - Search, request, and manage media | Discover Radarr/Sonarr server configurations

Related MCP server: Overseerr MCP Server

🔒 Security

  • 🤖 Automated Security Scanning

    • Dependabot for dependency updates (weekly)

    • CodeQL for code vulnerability analysis (PR + weekly)

    • Trivy for Docker image scanning (CI only - blocks PRs if vulnerabilities found)

    • CI validates everything during PR review, CD trusts CI and publishes

  • 🐳 Hardened Docker Images

    • Non-root user (mcpuser)

    • Multi-stage builds

    • Minimal Alpine base

    • dumb-init process management

  • ✅ Input Validation

    • URL and API key format validation

    • Fails fast with clear error messages

🛠️ Available Tools

Tool

Purpose

Key Features

search_media

Search & dedupe

Single/batch search, dedupe mode for 50-100 titles, franchise awareness

request_media

Request movies/TV

Batch requests, season validation, multi-season confirmation, dry-run mode

manage_media_requests

Manage requests

List/approve/decline/delete, filtering, summary statistics

get_media_details

Get media info

Batch lookup, flexible detail levels (basic/standard/full)

get_services

List Radarr/Sonarr servers

Discover server IDs, active defaults, 4K status

get_service_details

Get server config

Quality profiles, root folders, tags per server

📋 Prerequisites

  • Node.js 18.0 or higher

  • Seerr or Overseerr instance (self-hosted or managed)

  • Seerr/Overseerr API key (Settings → General in your instance)

🚀 Quick Start

npm install -g @jhomen368/overseerr-mcp

Configure with Claude Desktop:

Add to your configuration file:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "seerr": {
      "command": "npx",
      "args": ["-y", "@jhomen368/overseerr-mcp"],
      "env": {
        "SEERR_URL": "https://seerr.example.com",
        "SEERR_API_KEY": "your-api-key-here"
      }
    }
  }
}

Legacy Overseerr Users: If you're still using Overseerr (not Seerr), you can continue using the legacy variables:

{
  "env": {
    "OVERSEERR_URL": "https://overseerr.example.com",
    "OVERSEERR_API_KEY": "your-api-key-here"
  }
}

Both OVERSEERR_* and SEERR_* variables are supported for backward compatibility. Legacy variables will be removed in v3.0.0.

Option 2: Docker (Remote Access)

docker run -d \
  --name seerr-mcp \
  -p 8085:8085 \
  -e SEERR_URL=https://your-seerr-instance.com \
  -e SEERR_API_KEY=your-api-key-here \
  ghcr.io/jhomen368/overseerr-mcp:latest

Docker Compose:

services:
  seerr-mcp:
    image: ghcr.io/jhomen368/overseerr-mcp:latest
    container_name: seerr-mcp
    ports:
      - "8085:8085"
    environment:
      - SEERR_URL=https://your-seerr-instance.com
      - SEERR_API_KEY=your-api-key-here
    restart: unless-stopped

Test the server:

curl http://localhost:8085/health

Connect MCP clients:

  • Transport: Streamable HTTP

  • URL: http://localhost:8085/mcp

Option 3: From Source

git clone https://github.com/jhomen368/overseerr-mcp.git
cd overseerr-mcp
npm install
npm run build
node build/index.js

💡 Usage Examples

Batch Dedupe Workflow (Perfect for Anime Seasons)

// Check 50-100 titles in ONE API call
search_media({
  dedupeMode: true,
  titles: [
    "Frieren: Beyond Journey's End",
    "My Hero Academia Season 7",
    "Demon Slayer Season 4",
    // ... 47 more titles
  ],
  autoNormalize: true  // Strips "Season N", "Part N", etc.
})

Response:

{
  "summary": {
    "total": 50,
    "pass": 35,
    "blocked": 15,
    "passRate": "70%"
  },
  "results": [
    { "title": "Frieren", "status": "pass", "id": 209867 },
    { "title": "My Hero Academia S7", "status": "pass", "franchiseInfo": "S1-S6 in library" },
    { "title": "Demon Slayer S4", "status": "blocked", "reason": "Already requested" }
  ]
}

Request Media with Validation

// Single movie request
request_media({
  mediaType: "movie",
  mediaId: 438631
})

// TV show with specific seasons
request_media({
  mediaType: "tv",
  mediaId: 82856,
  seasons: [1, 2]
})

// All seasons (excludes season 0 by default)
request_media({
  mediaType: "tv",
  mediaId: 82856,
  seasons: "all"
})

Manage Requests

// List with filters
manage_media_requests({
  action: "list",
  filter: "pending",
  take: 20
})

// Batch approve
manage_media_requests({
  action: "approve",
  requestIds: [123, 124, 125]
})

// Get summary statistics
manage_media_requests({
  action: "list",
  summary: true
})

Service Discovery

// List all configured servers (Radarr + Sonarr)
get_services({})

// List only Radarr servers
get_services({ serviceType: "radarr" })

// Get quality profiles, root folders, and tags for a server
get_service_details({
  serviceType: "radarr",
  serverId: 0
})

// Use discovered values when requesting media
request_media({
  mediaType: "movie",
  mediaId: 438631,
  serverId: 0,
  profileId: 13,
  rootFolder: "/data/media/movies"
})

Natural Language Examples

Simply ask your AI assistant:

  • "Search for Inception in Seerr"

  • "Check if these 50 anime titles have been requested"

  • "Request Breaking Bad all seasons"

  • "Show me all pending media requests"

  • "Approve request ID 123"

  • "Get details for TMDB ID 550"

  • "What Radarr servers are configured?"

  • "Show me the quality profiles for my Sonarr server"

⚙️ Configuration

Environment Variables

Required:

  • SEERR_URL - Your Seerr/Overseerr instance URL

  • SEERR_API_KEY - API key from Settings → General

Legacy (deprecated, will be removed in v3.0.0):

  • OVERSEERR_URL - Use SEERR_URL instead

  • OVERSEERR_API_KEY - Use SEERR_API_KEY instead

Optional (with defaults):

CACHE_ENABLED=true                   # Enable caching
CACHE_SEARCH_TTL=300000             # Search cache: 5 min
CACHE_MEDIA_TTL=1800000             # Media cache: 30 min
CACHE_REQUESTS_TTL=60000            # Request cache: 1 min
CACHE_MAX_SIZE=1000                 # Max cache entries
CACHE_SERVICES_TTL=600000           # Services cache: 10 min
CACHE_SERVICEDETAILS_TTL=600000     # Service details cache: 10 min
REQUIRE_MULTI_SEASON_CONFIRM=true   # Confirm >24 episodes
HTTP_MODE=false                      # Enable HTTP transport
PORT=8085                            # HTTP server port

📚 Documentation

🔧 Troubleshooting

Connection Issues

  • Verify Seerr/Overseerr URL is accessible

  • Check API key validity (Settings → General)

  • Review firewall rules for remote access

Docker Issues

# Check logs
docker logs seerr-mcp

# Verify health
curl http://localhost:8085/health

# Restart container
docker restart seerr-mcp

Build Issues

# Ensure Node.js 18+
node --version

# Clean rebuild
rm -rf node_modules build
npm install
npm run build

🤝 Contributing

Contributions welcome! Please see CONTRIBUTING.md for guidelines.

📄 License

MIT License - see LICENSE for details

🙏 Acknowledgments


Support this project: PayPal

Available Tools

6 tools
get_media_detailsB

Get media details. Single/batch with level control (basic/standard/full). Media/season status: 1=UNKNOWN, 2=PENDING, 3=PROCESSING, 4=PARTIALLY_AVAILABLE, 5=AVAILABLE, 7=DELETED (Seerr). Code 6 is BLOCKLISTED in Seerr or DELETED in legacy Overseerr. Request statuses use a separate enum.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsNoBatch items
levelNoDetail levelstandard
fieldsNoSpecific fields
formatNocompact
mediaIdNoTMDB ID (single)
languageNoLanguage codeen
mediaTypeNoMedia type (single)

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden, and it does well by explaining the media/season status enum, the Seerr vs legacy Overseerr difference for code 6, and that request statuses are separate. It does not mention auth, side effects, or return shape, but the status-code clarification is genuinely valuable for correct interpretation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the core action comes first, followed by the non-obvious status caveats. The status-code detail is longer than typical, but it earns its place because the enum has version-specific meanings.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 7 parameters, no output schema, and no annotations, the description covers the main status-code ambiguity but leaves gaps: it does not explain what the returned payload looks like, how level values affect output, or how single vs batch selection behaves in practice. It is adequate for basic invocation but not fully self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 86%, so the baseline is 3. The description reinforces the level enum and single/batch intent, but it adds little beyond the schema for parameters like format, fields, language, or items. The status-code block applies to returned data, not to parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a concrete verb and object ('Get media details') and immediately states single/batch and level-control modes, so an agent knows what the tool does. It does not explicitly contrast itself with sibling get_service_details, which also fetches 'details', so differentiation is left largely to the name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus get_service_details, search_media, request_media, or get_services. No exclusions, prerequisites, or decision rules are given; the only usage signal is the implied purpose from the name and opening sentence.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_service_detailsB

Get quality profiles, root folders, tags, and language profiles (Sonarr) for a Radarr/Sonarr server.

ParametersJSON Schema
NameRequiredDescriptionDefault
serverIdNoServer ID from get_services (default: 0)
serviceTypeYesService type

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It states it retrieves data but does not disclose auth requirements, side effects, rate limits, or whether the tool is read-only (implied but not explicit).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with key purpose, no fluff. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given simple parameters and no output schema, description adequately lists the types of data returned. Could mention that servers from get_services are needed, but it's implied. Minor gap for moderate completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (both parameters described). The description adds no extra meaning beyond the schema; it lists output types but not parameter details. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get' and the resources: quality profiles, root folders, tags, and language profiles for a Radarr/Sonarr server. It distinguishes from siblings like get_media_details (media items) and get_services (list servers).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool vs siblings like get_media_details or search_media. No mention of prerequisites, when not to use, or how it fits in a workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_servicesA

List configured Radarr/Sonarr servers. Returns ID, name, isDefault, 4K status, active defaults (directory, profile, tags).

ParametersJSON Schema
NameRequiredDescriptionDefault
serviceTypeNoWhich service type to list. Omit for both.

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the burden. The description indicates a read operation ('List'), which is inherently non-destructive, but it does not explicitly state read-only behavior, permissions, or side effects. For a simple list operation, this is acceptable but could be more explicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loading the core action and then listing return fields. Every sentence adds value, and there is no redundant or unnecessary information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity of the tool (list operation with one optional parameter, no output schema), the description provides sufficient context: what the tool does and what fields are returned. No additional details (e.g., pagination) are necessary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema fully describes the single optional parameter with an enum and default behavior ('Omit for both'). The description does not add meaning beyond the schema, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'List configured Radarr/Sonarr servers.' It uses a specific verb ('List') and resource ('servers'), and lists the fields returned (ID, name, isDefault, etc.). This distinguishes it from sibling tools like 'get_service_details' which likely retrieves a single server.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for retrieving all configured servers and mentions the fields returned. However, it does not explicitly contrast with sibling tools like 'get_service_details' or state when to use this versus alternatives, e.g., for an overview vs. detailed info.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_media_requestsB

Manage requests: get/list/approve/decline/delete. Supports filters and batching. Filters: all|pending|approved|available|processing|unavailable|failed

ParametersJSON Schema
NameRequiredDescriptionDefault
skipNo
sortNoadded
takeNo
actionYesAction
filterNoall
formatNocompact
summaryNoStats instead of list
requestIdNoRequest ID (single)
requestIdsNoRequest IDs (batch)

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It mentions batching and filters but does not disclose destructive nature of 'delete', side effects of 'approve'/'decline', or required permissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise: two sentences delivering purpose and filter options. No filler, front-loaded information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 9 parameters, multiple actions, batch support, and no output schema, the description is inadequate. Missing explanations for format, summary, batching mechanics, and action specifics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 44% (only action, summary, requestId, requestIds have descriptions). Description adds filter enum values and batching hint but does not explain skip, take, sort, format, or their interactions. Partially compensates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool manages media requests with specific actions (get/list/approve/decline/delete). It distinguishes from siblings like 'request_media' (creation) and 'search_media' (searching) by focusing on request management.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description implies usage for request management but does not explicitly guide when to use this tool vs siblings like 'request_media' or 'get_media_details'. No exclusion or alternative mention.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

request_mediaA

Request media with auto-confirm for TV ≤24 eps. Single/batch with validation. Confirm: Movies auto | TV ≤24 eps auto | TV >24 eps needs confirmed:true TV needs seasons (array or "all"). "all"=no specials; [0,1,2]=with specials

ParametersJSON Schema
NameRequiredDescriptionDefault
is4kNoRequest 4K
itemsNoBatch items
dryRunNoPreview only
mediaIdNoTMDB ID (single)
seasonsNoTV seasons. "all"=no season 0 (specials); [0,1,2]=with specials
serverIdNo
confirmedNoConfirm multi-season
mediaTypeNoMedia type (single)
profileIdNo
rootFolderNo
validateFirstNoCheck existing requests and availability. TV checks only requested seasons and skips covered seasons.

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. It does disclose the auto-confirm thresholds and the season/specials semantics. However, it omits side effects, return values, permissions, and what 'validation' actually checks or does, leaving a meaningful transparency gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences front-load the purpose and then provide the confirmation rules and season semantics. There is no filler; every clause conveys a constraint or a meaningful alternative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 11 parameters and no annotations or output schema, yet the description omits several parameters (serverId, profileId, rootFolder) and any response/error behavior. The core auto-confirm logic is well covered, but an agent still lacks full context for confident invocation in all cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 73%, so the schema already documents most parameters. The description adds real semantic value by tying 'confirmed:true' to episode-count thresholds and explaining how 'all' vs an array affects specials in TV requests, which goes beyond the schema's parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the operation clearly: 'Request media' with specific auto-confirm behavior for TV ≤24 eps and single/batch/validation modes. It distinguishes this from the sibling lookup tools (search_media, get_media_details) and the management tool (manage_media_requests).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage context: movies and short TV auto-confirm, longer TV requires confirmed:true, and TV requires seasons with the specials interpretation. It doesn't explicitly name alternatives or when-not-to-use cases, so no exclusion guidance is present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_mediaA

Search movies/TV with single/batch/dedupe modes. Dedupe returns actionable status for batch processing. Status: NOT_FOUND | ALREADY_AVAILABLE | ALREADY_REQUESTED | SEASON_AVAILABLE | SEASON_REQUESTED | AVAILABLE_FOR_REQUEST

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number
limitNoMax results
queryNoSingle search query
formatNoResponse formatcompact
titlesNoTitles to check (dedupe mode)
queriesNoMultiple search queries (batch mode)
languageNoLanguage codeen
dedupeModeNoBatch dedupe with availability check
autoRequestNoAuto-request passing items (requires dedupeMode). TV requests over 24 new episodes need requestOptions.confirmed:true.
autoNormalizeNoStrip "Season N"/"Part N" from single, batch, and dedupe search titles
includeDetailsNoAdd a details object to search results in any mode or format (fetches per-result details)
requestOptionsNoAutoRequest options
checkAvailabilityNoCheck status (slower, fetches per-result details)

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full disclosure burden. It does add genuine behavioral value by disclosing that dedupe returns an actionable status and enumerating the six possible status values. However, it omits the most consequential trait: despite being a 'search' tool, it can mutate state via autoRequest (which creates requests), and it says nothing about read-only guarantees, pagination, or rate limits. Partial disclosure, no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is tight: two sentences carry purpose and dedupe behavior, and the status enum provides the output vocabulary an agent needs. Facts are front-loaded with the core verb and resource first. The trailing status line after a newline reads slightly as a dangling fragment, and the enum could be folded into the dedupe sentence, but every element earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complexity is high — 13 parameters, nested objects, zero annotations, and no output schema — so the description must carry tool-level semantics that the schema cannot. It fails to explain the interplay among dedupeMode/autoRequest/checkAvailability, does not warn that autoRequest triggers real requests, and never describes the shape of search results or pagination. The rich schema softens the gap but does not fill it; a first-time agent would be unsure what a result looks like or that this tool can mutate data.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline 3 applies even though the description adds no per-parameter wordsmithing. The schema itself is rich — includeDetails enumerates exact field groups, autoRequest documents the 24-episode confirmation rule, and requestOptions explains season semantics — so no compensation is needed from the description. The description's mention of modes maps loosely to queries/titles/dedupeMode but adds no new meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Search movies/TV' plus the mode set (single/batch/dedupe), which immediately distinguishes this from sibling get_/request_/manage_ tools. The dedupe sentence further clarifies a distinctive capability (actionable batch status), so an agent can separate search_media from get_media_details or request_media without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied through the mode names: single for one query, batch for multiple queries, and dedupe 'for batch processing' with an availability verdict. However, the description never states when to prefer this tool over siblings like request_media or get_media_details, and it offers no exclusions or when-not-to-use guidance. The mode semantics are suggestive but not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updatesv2.3.1
    • Changedrequest_media1 field changed
      • changedInput schema / properties / validateFirst / description
        Previous value: -"Check existing"New value: +"Check existing requests and availability. TV checks only requested seasons and skips covered seasons."
    • Changedsearch_media4 fields changed
      • changedInput schema / properties / autoNormalize / description
        Previous value: -"Strip \"Season N\"/\"Part N\" from titles"New value: +"Strip \"Season N\"/\"Part N\" from single, batch, and dedupe search titles"
      • changedInput schema / properties / autoRequest / description
        Previous value: -"Auto-request passing items (requires dedupeMode)"New value: +"Auto-request passing items (requires dedupeMode). TV requests over 24 new episodes need requestOptions.confirmed:true."
      • changedInput schema / properties / includeDetails / description
        Previous value: -"Add details to dedupe results (dedupe only)"New value: +"Add a details object to search results in any mode or format (fetches per-result details)"
      • addedInput schema / properties / requestOptions / properties / confirmed
        Added value: +{
        +  "default": false,
        +  "description": "Confirm TV requests over 24 new episodes",
        +  "type": "boolean"
        +}
  2. 6 tool updatesv2.1.3
    • Addedget_media_details
    • Addedget_service_details
    • Addedget_services
    • Addedmanage_media_requests
    • Addedrequest_media
    • Addedsearch_media
  3. 4 tool updatesv2.1.2
    • Removedget_media_details
    • Removedmanage_media_requests
    • Removedrequest_media
    • Removedsearch_media
  4. 4 tool updatesv1.0.0
    • Addedget_media_details
    • Addedmanage_media_requests
    • Changedrequest_media12 fields changed
      • addedInput schema / properties / confirmed
        Added value: +{
        +  "default": false,
        +  "description": "Confirm multi-season",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / dryRun
        Added value: +{
        +  "default": false,
        +  "description": "Preview only",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / is4k / description
        Previous value: -"Request 4K version (default: false)"New value: +"Request 4K"
      • addedInput schema / properties / items
        Added value: +{
        +  "description": "Batch items",
        +  "items": {
        +    "properties": {
        +      "is4k": {
        +        "type": "boolean"
        +      },
        +      "mediaId": {
        +        "type": "number"
        +      },
        +      "mediaType": {
        +        "enum": [
        +          "movie",
        +          "tv"
        +        ],
        +        "type": "string"
        +      },
        +      "seasons": {
        +        "description": "TV seasons (REQUIRED). \"all\"=no season 0 (specials); [0,1,2]=with specials",
        +        "oneOf": [
        +          {
        +            "items": {
        +              "type": "number"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "enum": [
        +              "all"
        +            ],
        +            "type": "string"
        +          }
        +        ]
        +      }
        +    },
        +    "required": [
        +      "mediaType",
        +      "mediaId"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / mediaId / description
        Previous value: -"TMDB ID of the media"New value: +"TMDB ID (single)"
      • changedInput schema / properties / mediaType / description
        Previous value: -"Type of media to request"New value: +"Media type (single)"
      • removedInput schema / properties / profileId / description
        Removed value: -"Quality profile ID (optional)"
      • removedInput schema / properties / rootFolder / description
        Removed value: -"Root folder path (optional)"
      • changedInput schema / properties / seasons / description
        Previous value: -"For TV shows: array of season numbers or \"all\" (optional)"New value: +"TV seasons. \"all\"=no season 0 (specials); [0,1,2]=with specials"
      • removedInput schema / properties / serverId / description
        Removed value: -"Specific server ID (optional)"
      • addedInput schema / properties / validateFirst
        Added value: +{
        +  "default": true,
        +  "description": "Check existing",
        +  "type": "boolean"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "mediaType",
        -  "mediaId"
        -]
    • Changedsearch_media14 fields changed
      • addedInput schema / properties / autoNormalize
        Added value: +{
        +  "default": false,
        +  "description": "Strip \"Season N\"/\"Part N\" from titles",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / autoRequest
        Added value: +{
        +  "default": false,
        +  "description": "Auto-request passing items (requires dedupeMode)",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / checkAvailability
        Added value: +{
        +  "default": false,
        +  "description": "Check status (slower, fetches per-result details)",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / dedupeMode
        Added value: +{
        +  "default": false,
        +  "description": "Batch dedupe with availability check",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / format
        Added value: +{
        +  "default": "compact",
        +  "description": "Response format",
        +  "enum": [
        +    "compact",
        +    "standard",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / includeDetails
        Added value: +{
        +  "description": "Add details to dedupe results (dedupe only)",
        +  "properties": {
        +    "fields": {
        +      "description": "Basic: mediaType,year,posterPath | Standard: rating,overview,genres,runtime | TV: numberOfSeasons,numberOfEpisodes,seasons | Advanced: releaseDate,firstAirDate,originalTitle,originalName,popularity,backdropPath,homepage,status,tagline | Availability: mediaStatus,hasRequests,requestCount | targetSeason auto-adds for season numbers",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "includeSeason": {
        +      "default": true,
        +      "description": "Auto-add targetSeason for TV with season in title",
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / language / description
        Previous value: -"Language code (e.g., \"en\", default: \"en\")"New value: +"Language code"
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Max results",
        +  "type": "number"
        +}
      • changedInput schema / properties / page / description
        Previous value: -"Page number for pagination (default: 1)"New value: +"Page number"
      • addedInput schema / properties / queries
        Added value: +{
        +  "description": "Multiple search queries (batch mode)",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / query / description
        Previous value: -"Search query (movie/TV show/person name)"New value: +"Single search query"
      • addedInput schema / properties / requestOptions
        Added value: +{
        +  "description": "AutoRequest options",
        +  "properties": {
        +    "dryRun": {
        +      "default": false,
        +      "description": "Preview only",
        +      "type": "boolean"
        +    },
        +    "is4k": {
        +      "default": false,
        +      "description": "Request 4K",
        +      "type": "boolean"
        +    },
        +    "profileId": {
        +      "type": "number"
        +    },
        +    "rootFolder": {
        +      "type": "string"
        +    },
        +    "seasons": {
        +      "description": "TV seasons. \"all\"=no season 0 (specials); [0,1,2]=with specials",
        +      "oneOf": [
        +        {
        +          "items": {
        +            "type": "number"
        +          },
        +          "type": "array"
        +        },
        +        {
        +          "enum": [
        +            "all"
        +          ],
        +          "type": "string"
        +        }
        +      ]
        +    },
        +    "serverId": {
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / titles
        Added value: +{
        +  "description": "Titles to check (dedupe mode)",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "query"
        -]
  5. 2 tool updates
    • First observedrequest_media
    • First observedsearch_media

TDQS

A4/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a distinct resource and action: service configuration details, service listing, request management, media search, media request submission, and media status retrieval. No two tools have overlapping purposes; an agent can confidently select the correct tool for a given task.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern (e.g., get_service_details, manage_media_requests, search_media, request_media). The naming is uniform and predictable, making it easy to infer functionality from the name alone.

Tool Count5/5

With 6 tools, the server is well-scoped for its purpose of managing media requests on Overseerr. Each tool serves a distinct function, and the count is neither too sparse nor bloated, providing a focused yet complete surface.

Completeness5/5

The tool set covers the full media request workflow: searching for media, requesting media, managing requests (get/list/approve/decline/delete), and retrieving detailed status for both services and media. No obvious gaps exist for the stated domain, and the inclusion of batch operations and status enums enhances capability.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers