Reka

Understand your videos with Reka AI — search, ask questions, and extract insights.

Should I use this

Quality & Safety

A
Description quality
95%
Schema completeness
66%
Naming quality
96%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,836Tokens (tool definitions)
~1.5 KBTypical response size
Significant attention impact (3.00% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "mcp": {
      "command": "uvx",
      "args": [
        "reka-mcp"
      ]
    }
  }
}

Runnable packages

pypireka-mcp0.1.10stdio

Remote endpoints

https://mcp.reka.ai/mcpstreamable-http

What it can do

Tool inventory

Tools (17)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟡upload_video(video_url, name, description, group_id, rationale)

Upload a video from a URL. Returns a video_id. Local file paths are not accepted; upload files outside the MCP server and pass a reachable video_url. The upload runs asynchronously — poll get_video until status is 'uploaded', then call index_video to enable search and analysis.

Input Schema

{
  "type": "object",
  "properties": {
    "video_url": {
      "title": "Video Url",
      "type": "string"
    },
    "name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Name"
    },
    "description": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Description"
    },
    "group_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Group Id"
    },
    "rationale": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Rationale"
    }
  },
  "required": [
    "video_url"
  ],
  "title": "upload_videoArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "title": "Result",
      "type": "string"
    }
  },
  "required": [
    "result"
  ],
  "title": "upload_videoOutput"
}
🟢list_videos(group_id, rationale)

List all videos in your account, or filter to a specific group by passing group_id. Shows upload status and which features have been indexed for each video. Each video's 'url' is a short-lived HTTPS presigned URL (expires within hours) — fetch immediately and do not store; call list_videos or get_video again for a fresh URL when needed.

Input Schema

{
  "type": "object",
  "properties": {
    "group_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Group Id"
    },
    "rationale": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Rationale"
    }
  },
  "title": "list_videosArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "title": "Result",
      "type": "string"
    }
  },
  "required": [
    "result"
  ],
  "title": "list_videosOutput"
}
🟢get_video(video_id, rationale)

Get detailed information about a video including upload status, metadata (duration, resolution, fps), and per-feature indexing status. Use this to check if upload or indexing is complete. The 'url' field is a short-lived HTTPS presigned URL (expires within hours) — fetch immediately and do not store; call get_video again for a fresh URL when needed.

Input Schema

{
  "type": "object",
  "properties": {
    "video_id": {
      "title": "Video Id",
      "type": "string"
    },
    "rationale": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Rationale"
    }
  },
  "required": [
    "video_id"
  ],
  "title": "get_videoArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "title": "Result",
      "type": "string"
    }
  },
  "required": [
    "result"
  ],
  "title": "get_videoOutput"
}
🔴update_video(video_id, name, title, description, group_id, ...)

Update a video's display name, title, description, or move it to a different group. At least one field must be provided. To remove a video from its group, pass group_id as null.

Input Schema

{
  "type": "object",
  "properties": {
    "video_id": {
      "title": "Video Id",
      "type": "string"
    },
    "name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Name"
    },
    "title": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Title"
    },
    "description": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Description"
    },
    "group_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Group Id"
    },
    "move_group": {
      "default": false,
      "title": "Move Group",
      "type": "boolean"
    },
    "rationale": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Rationale"
    }
  },
  "required": [
    "video_id"
  ],
  "title": "update_videoArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "title": "Result",
      "type": "string"
    }
  },
  "required": [
    "result"
  ],
  "title": "update_videoOutput"
}
🔴delete_video(video_id, rationale)

Permanently delete a video and all its indexed data (transcript, captions, embeddings, etc.). This cannot be undone.

Input Schema

{
  "type": "object",
  "properties": {
    "video_id": {
      "title": "Video Id",
      "type": "string"
    },
    "rationale": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Rationale"
    }
  },
  "required": [
    "video_id"
  ],
  "title": "delete_videoArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "title": "Result",
      "type": "string"
    }
  },
  "required": [
    "result"
  ],
  "title": "delete_videoOutput"
}
🟡create_group(name, rationale)

Create a new video group. Groups organize videos into collections. Returns the new group's ID and name.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "title": "Name",
      "type": "string"
    },
    "rationale": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Rationale"
    }
  },
  "required": [
    "name"
  ],
  "title": "create_groupArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "title": "Result",
      "type": "string"
    }
  },
  "required": [
    "result"
  ],
  "title": "create_groupOutput"
}
🟢list_groups(rationale)

List all video groups. Use list_videos with a group_id to see videos in a specific group.

Input Schema

{
  "type": "object",
  "properties": {
    "rationale": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Rationale"
    }
  },
  "title": "list_groupsArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "title": "Result",
      "type": "string"
    }
  },
  "required": [
    "result"
  ],
  "title": "list_groupsOutput"
}
🔴delete_group(group_id, rationale)

Delete a video group. Videos in the group are not deleted — they are simply removed from the group.

Input Schema

{
  "type": "object",
  "properties": {
    "group_id": {
      "title": "Group Id",
      "type": "string"
    },
    "rationale": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Rationale"
    }
  },
  "required": [
    "group_id"
  ],
  "title": "delete_groupArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "title": "Result",
      "type": "string"
    }
  },
  "required": [
    "result"
  ],
  "title": "delete_groupOutput"
}
🟢index_video(video_id, pipeline, scene_detection, rationale)

Index a video for search, QA, or full analysis. Processes the video through a pipeline of AI features. Typically takes 3-7 minutes; longer for long videos or the 'full' pipeline. Times out after 10 minutes by default. Pipelines: - search_only: transcription + captions + embeddings (enables search_videos) - qa_only: transcription + captions (enables ask_video) - full: transcription + captions + embeddings (enables all tools) Scene detection is enabled by default and produces scene boundaries for get_scenes. Pass scene_detection=False to skip it. Prerequisites: if using video_id, the video must be in 'uploaded' status. Use get_video to check status before calling this tool.

Input Schema

{
  "type": "object",
  "properties": {
    "video_id": {
      "title": "Video Id",
      "type": "string"
    },
    "pipeline": {
      "default": "search_only",
      "enum": [
        "search_only",
        "qa_only",
        "full"
      ],
      "title": "Pipeline",
      "type": "string"
    },
    "scene_detection": {
      "default": true,
      "title": "Scene Detection",
      "type": "boolean"
    },
    "rationale": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Rationale"
    }
  },
  "required": [
    "video_id"
  ],
  "title": "index_video_hostedArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "title": "Result",
      "type": "string"
    }
  },
  "required": [
    "result"
  ],
  "title": "index_video_hostedOutput"
}
🟢search_videos(query, video_ids, group_id, max_results, rationale)

Find WHEN and WHERE something happens across your videos. Returns timestamped results ranked by relevance — use these timestamps as start/end in ask_video for focused analysis. This is the recommended first step for most questions. Instead of asking ask_video about the entire video, search first to narrow down the relevant moments. Each result's 'video_url' is a short-lived HTTPS presigned URL (expires within hours) — fetch immediately and do not store; call search_videos or get_video again for a fresh URL when needed. Requires search_only or full pipeline.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "title": "Query",
      "type": "string"
    },
    "video_ids": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Video Ids"
    },
    "group_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Group Id"
    },
    "max_results": {
      "default": 10,
      "title": "Max Results",
      "type": "integer"
    },
    "rationale": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Rationale"
    }
  },
  "required": [
    "query"
  ],
  "title": "search_videosArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "title": "Result",
      "type": "string"
    }
  },
  "required": [
    "result"
  ],
  "title": "search_videosOutput"
}
🟢ask_video(question, video_id, start, end, videos, ...)

Ask a question about one or more videos with visual analysis. Most effective on focused time ranges — use start/end to specify the segment to analyze. BEFORE calling this tool, read the reka://docs/guide resource for recommended workflows. In most cases, you should first: - search_videos to find WHEN something happens, then pass those timestamps here as start/end - segment_video to detect and locate specific objects - get_transcript to read what was said For single-video questions, pass video_id with start/end. For cross-video questions, pass videos — a list of video references with start/end each. For follow-up questions, pass conversation_id from the previous response. You can add start/end to drill into a specific moment while keeping the conversation context. Requires qa_only or full pipeline.

Input Schema

{
  "type": "object",
  "properties": {
    "question": {
      "title": "Question",
      "type": "string"
    },
    "video_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Video Id"
    },
    "start": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Start"
    },
    "end": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "End"
    },
    "videos": {
      "anyOf": [
        {
          "items": {
            "$ref": "#/$defs/VideoContext"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Videos"
    },
    "conversation_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Conversation Id"
    },
    "rationale": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Rationale"
    }
  },
  "required": [
    "question"
  ],
  "$defs": {
    "VideoContext": {
      "properties": {
        "video_id": {
          "title": "Video Id",
          "type": "string"
        },
        "start": {
          "title": "Start",
          "type": "number"
        },
        "end": {
          "title": "End",
          "type": "number"
        }
      },
      "title": "VideoContext",
      "type": "object"
    }
  },
  "title": "ask_videoArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "title": "Result",
      "type": "string"
    }
  },
  "required": [
    "result"
  ],
  "title": "ask_videoOutput"
}
🟢segment_video(video_id, prompts, start, end, threshold, ...)

Detect objects in a video segment using text prompts. Describe what to look for and get per-frame detections with bounding boxes and confidence scores. Prompt tips: - Use broad, visual categories: 'animal', 'vehicle', 'person', 'text on screen' - Specific labels ('rabbit', 'Toyota') are less reliable — the detector matches visual patterns, not semantic concepts - Best for confirming whether a category of object appears in a time window, not for precise identification How to pick a time range: - Use search_videos to find WHEN something appears, then pass those timestamps here - Use get_scenes to scan systematically — call segment_video once per scene (scenes typically fit in the 15s window) - Or pass any range you already know Maximum range is 15 seconds per call; for longer spans, make multiple calls with consecutive windows. Does NOT require any feature indexing — works on any uploaded video.

Input Schema

{
  "type": "object",
  "properties": {
    "video_id": {
      "title": "Video Id",
      "type": "string"
    },
    "prompts": {
      "items": {
        "type": "string"
      },
      "title": "Prompts",
      "type": "array"
    },
    "start": {
      "title": "Start",
      "type": "number"
    },
    "end": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "End"
    },
    "threshold": {
      "default": 0.5,
      "title": "Threshold",
      "type": "number"
    },
    "rationale": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Rationale"
    }
  },
  "required": [
    "video_id",
    "prompts",
    "start"
  ],
  "title": "segment_videoArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "title": "Result",
      "type": "string"
    }
  },
  "required": [
    "result"
  ],
  "title": "segment_videoOutput"
}
🟢get_transcript(video_id, format, start, end, max_results, ...)

Get the spoken words in a video. Use this instead of ask_video when you need to read what was said — it returns the actual text, not a summary. Use start/end to narrow results for long videos. Requires the transcript feature to be indexed.

Input Schema

{
  "type": "object",
  "properties": {
    "video_id": {
      "title": "Video Id",
      "type": "string"
    },
    "format": {
      "default": "text",
      "enum": [
        "text",
        "segments",
        "words"
      ],
      "title": "Format",
      "type": "string"
    },
    "start": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Start"
    },
    "end": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "End"
    },
    "max_results": {
      "default": 100,
      "title": "Max Results",
      "type": "integer"
    },
    "max_chars": {
      "default": 10000,
      "title": "Max Chars",
      "type": "integer"
    },
    "rationale": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Rationale"
    }
  },
  "required": [
    "video_id"
  ],
  "title": "get_transcriptArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "title": "Result",
      "type": "string"
    }
  },
  "required": [
    "result"
  ],
  "title": "get_transcriptOutput"
}
🟢get_captions(video_id, start, end, max_results, rationale)

Get AI-generated visual descriptions of what happens on screen. Use this to understand the visual content without watching — each caption describes a short segment with timestamps. Use start/end to narrow results. Requires the captions feature (qa_only or full pipeline).

Input Schema

{
  "type": "object",
  "properties": {
    "video_id": {
      "title": "Video Id",
      "type": "string"
    },
    "start": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Start"
    },
    "end": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "End"
    },
    "max_results": {
      "default": 50,
      "title": "Max Results",
      "type": "integer"
    },
    "rationale": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Rationale"
    }
  },
  "required": [
    "video_id"
  ],
  "title": "get_captionsArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "title": "Result",
      "type": "string"
    }
  },
  "required": [
    "result"
  ],
  "title": "get_captionsOutput"
}
🟢get_scenes(video_id, max_results, rationale)

Get detected scene boundaries with start/end timestamps. Use this to understand the video's structure, then pass scene timestamps as start/end to: - ask_video for per-scene contextual analysis - segment_video to detect specific objects per scene (scenes typically fit in segment_video's 15s max range) Requires transcript indexed with scene detection (on by default; skipped only if index_video was called with scene_detection=False).

Input Schema

{
  "type": "object",
  "properties": {
    "video_id": {
      "title": "Video Id",
      "type": "string"
    },
    "max_results": {
      "default": 200,
      "title": "Max Results",
      "type": "integer"
    },
    "rationale": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Rationale"
    }
  },
  "required": [
    "video_id"
  ],
  "title": "get_scenesArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "title": "Result",
      "type": "string"
    }
  },
  "required": [
    "result"
  ],
  "title": "get_scenesOutput"
}
🟢get_feature_catalog(rationale)

List available video analysis features with their dependencies and descriptions. Use this to understand what features exist and what pipelines to use with index_video.

Input Schema

{
  "type": "object",
  "properties": {
    "rationale": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Rationale"
    }
  },
  "title": "get_feature_catalogArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "title": "Result",
      "type": "string"
    }
  },
  "required": [
    "result"
  ],
  "title": "get_feature_catalogOutput"
}
🟢summarize_video(video_id, rationale)

Start here. Get a compact overview of a video: metadata, which features are indexed, a transcript preview, and scene count. Use this to decide which tools to call next — then use segment_video to detect specific objects in time ranges of interest.

Input Schema

{
  "type": "object",
  "properties": {
    "video_id": {
      "title": "Video Id",
      "type": "string"
    },
    "rationale": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Rationale"
    }
  },
  "required": [
    "video_id"
  ],
  "title": "summarize_videoArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "title": "Result",
      "type": "string"
    }
  },
  "required": [
    "result"
  ],
  "title": "summarize_videoOutput"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded17 tools
verifiedversion not recorded17 tools
verifiedversion not recorded17 tools