Skip to main content
Glama

get_media_details

Retrieve detailed information about movies and TV shows from Overseerr, supporting single or batch requests with adjustable detail levels for media management.

Instructions

Get media details. Single/batch with level control (basic/standard/full).

Input Schema

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

Implementation Reference

  • src/index.ts:574-624 (registration)
    Registration of the get_media_details tool, including name, description, and detailed inputSchema for single/batch requests with level/field control.
      name: 'get_media_details',
      description:
        'Get media details. Single/batch with level control (basic/standard/full).',
      inputSchema: {
        type: 'object',
        properties: {
          mediaType: {
            type: 'string',
            enum: ['movie', 'tv'],
            description: 'Media type (single)',
          },
          mediaId: {
            type: 'number',
            description: 'TMDB ID (single)',
          },
          items: {
            type: 'array',
            items: {
              type: 'object',
              properties: {
                mediaType: { type: 'string', enum: ['movie', 'tv'] },
                mediaId: { type: 'number' },
              },
              required: ['mediaType', 'mediaId'],
            },
            description: 'Batch items',
          },
          level: {
            type: 'string',
            enum: ['basic', 'standard', 'full'],
            description: 'Detail level',
            default: 'standard',
          },
          fields: {
            type: 'array',
            items: { type: 'string' },
            description: 'Specific fields',
          },
          format: {
            type: 'string',
            enum: ['compact', 'standard', 'full'],
            default: 'compact',
          },
          language: {
            type: 'string',
            description: 'Language code',
            default: 'en',
          },
        },
      },
    },
  • Core single-item handler: fetches TMDB details via Overseerr API, caches result, applies filtering by level or fields, returns JSON.
    private async handleSingleDetails(args: GetDetailsArgs) {
      const { mediaType, mediaId, level, fields, language } = args;
    
      const cacheKey = { mediaType, mediaId, language: language || 'en' };
      let details = this.cache.get<MediaDetails>('mediaDetails', cacheKey);
    
      if (!details) {
        const params = language ? { language } : {};
        const response = await this.axiosInstance.get<MediaDetails>(
          `/${mediaType}/${mediaId}`,
          { params }
        );
        details = response.data;
        this.cache.set('mediaDetails', cacheKey, details);
      }
    
      // Apply level filtering
      const filtered = this.filterDetailsByLevel(details, level || 'standard', fields);
    
      return {
        content: [
          {
            type: 'text',
            text: JSON.stringify(filtered, null, 2),
          },
        ],
      };
    }
  • Batch handler: parallel fetches details for multiple items using retry, caching, filtering; summarizes success/errors.
    private async handleBatchDetails(args: GetDetailsArgs) {
      const items = args.items!;
    
      const results = await batchWithRetry(
        items,
        async (item) => {
          const cacheKey = { 
            mediaType: item.mediaType, 
            mediaId: item.mediaId,
            language: args.language || 'en'
          };
          let details = this.cache.get<MediaDetails>('mediaDetails', cacheKey);
          if (!details) {
            const response = await this.axiosInstance.get<MediaDetails>(
              `/${item.mediaType}/${item.mediaId}`,
              { params: args.language ? { language: args.language } : {} }
            );
            details = response.data;
            this.cache.set('mediaDetails', cacheKey, details);
          }
    
          return this.filterDetailsByLevel(details, args.level || 'standard', args.fields);
        }
      );
    
      const successful = results.filter(r => r.success);
      const failed = results.filter(r => !r.success);
    
      return {
        content: [
          {
            type: 'text',
            text: JSON.stringify({
              summary: {
                total: items.length,
                successful: successful.length,
                failed: failed.length
              },
              results: successful.map(r => r.result),
              errors: failed.map(r => ({
                item: r.item,
                error: r.error?.message || 'Unknown error'
              }))
            }, null, 2),
          }
        ]
      };
    }
  • Entry point handler dispatched from tool call: routes to single or batch based on input.
    private async handleGetDetails(args: GetDetailsArgs) {
      const detailsArgs = args as GetDetailsArgs;
    
      // Batch mode
      if (detailsArgs.items && detailsArgs.items.length > 0) {
        return this.handleBatchDetails(detailsArgs);
      }
    
      // Single mode
      if (!detailsArgs.mediaType || !detailsArgs.mediaId) {
        throw new McpError(
          ErrorCode.InvalidParams,
          'Must provide mediaType and mediaId (or items array for batch)'
        );
      }
    
      return this.handleSingleDetails(detailsArgs);
    }
  • Filters media details output by level (basic/standard/full) or specific fields using predefined mappers; used by both single/batch handlers.
    private filterDetailsByLevel(
      details: MediaDetails,
      level: string,
      fields?: string[]
    ): any {
      // If specific fields requested, return only those
      if (fields && fields.length > 0) {
        const filtered: any = {};
        const item = { mediaType: details.mediaType || 'movie', id: details.id };
        fields.forEach(field => {
          const mapper = FIELD_MAP[field];
          if (mapper) {
            const value = mapper(item, details);
            if (value !== undefined) {
              filtered[field] = value;
            }
          }
        });
        return filtered;
      }
    
      // Level-based filtering
      switch (level) {
        case 'basic':
          return {
            id: details.id,
            mediaType: details.mediaType,
            title: details.title || details.name,
            overview: details.overview,
            year: details.releaseDate?.substring(0, 4) || details.firstAirDate?.substring(0, 4),
            rating: details.voteAverage,
            mediaInfo: details.mediaInfo ? {
              status: this.getMediaStatusString(details.mediaInfo.status),
              hasRequests: (details.mediaInfo.requests?.length || 0) > 0,
            } : undefined,
          };
    
        case 'standard':
          return {
            mediaType: details.mediaType,
            id: details.id,
            title: details.title || details.name,
            overview: details.overview,
            releaseDate: details.releaseDate || details.firstAirDate,
            genres: details.genres,
            voteAverage: details.voteAverage,
            runtime: details.runtime,
            numberOfSeasons: details.numberOfSeasons,
            numberOfEpisodes: details.numberOfEpisodes,
            seasons: details.seasons,
            mediaInfo: details.mediaInfo,
          };
    
        case 'full':
        default:
          return details;
      }
    }
  • TypeScript interface defining input parameters for get_media_details tool, matching the JSON schema.
    export interface GetDetailsArgs {
      mediaType?: 'movie' | 'tv';
      mediaId?: number;
      items?: Array<{
        mediaType: 'movie' | 'tv';
        mediaId: number;
      }>;
      level?: 'basic' | 'standard' | 'full';
      fields?: string[];
      format?: 'compact' | 'standard' | 'full';
      language?: string;
    }

Tool Definition Quality

Score is being calculated. Check back soon.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jhomen368/overseerr-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server