flick
Provides tools for interacting with a Jellyfin media server, enabling agents to search the library, retrieve item metadata, list active playback sessions, view media libraries, and fetch next-up episodes.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@flicksearch my Jellyfin library for 'matrix'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Flick is an MCP (Model Context Protocol) server that connects AI agents to your Jellyfin media server. Once it's registered with an MCP-capable client, your agent can search the library, look up item details, see what's playing right now, and plan the next movie night — no browser, no hand-rolled API scripts.
What is this?
A small Python package with two parts:
flick/server.py— a FastMCP server exposing five tools:search,info,sessions,libraries,next_up.flick/jellyfin.py— a thin, synchronous HTTP client for the Jellyfin REST API, built on the Python standard library only (urllib). Nohttpx, norequests.
It talks to your existing Jellyfin server over its normal HTTP API; nothing is installed on the server and no files are modified there.
Related MCP server: Jellyseerr MCP Server
Why?
Jellyfin's REST API is powerful but raw: endpoints, query params, auth headers, paging. Agents are bad at guessing those and good at using small, well-described tools. Flick is that small surface:
one dependency (
mcp), one auth header (X-Emby-Token), five tools;boring, readable, stdlib-only HTTP code you can audit in minutes;
agents get structured JSON back, so they can reason about titles, types, and IDs.
Tools
Tool | Description | Args |
| Search the whole library by title (movies, shows, episodes, …) |
|
| Full metadata for a single library item |
|
| Active playback sessions: who is watching what, on which device | — |
| Top-level media libraries (Movies, TV Shows, …) | — |
| Next unwatched episode of shows you're following |
|
Quickstart
Requires Python 3.10+ and uv (or any venv + pip).
git clone <this-repo> flick
cd flick
uv venv # create .venv
uv pip install -e . # installs mcp + the flick package
# Point at your Jellyfin server
export JELLYFIN_URL=http://localhost:8096
export JELLYFIN_API_KEY=your-key-here
.venv/bin/flick # starts the MCP server over stdioGetting an API key
Open the Jellyfin web UI → Dashboard (hamburger menu → Dashboard).
Go to Advanced → API Keys.
Click New API Key, give it a name (e.g.
flick), and click OK.Copy the generated key — it is shown only once.
The key authenticates every request via the X-Emby-Token header. Keep it out of git
(see .gitignore) and pass it through the environment or your client's env block.
JELLYFIN_URLdefaults tohttp://localhost:8096if unset.JELLYFIN_API_KEYhas no default: the server refuses to start without it.
Client setup examples
Claude Desktop
Edit claude_desktop_config.json (Claude → Settings → Developer → Edit Config):
{
"mcpServers": {
"flick": {
"command": "/absolute/path/to/flick/.venv/bin/flick",
"env": {
"JELLYFIN_URL": "http://localhost:8096",
"JELLYFIN_API_KEY": "your-key-here"
}
}
}
}Cursor
Create/merge .cursor/mcp.json in your project:
{
"mcpServers": {
"flick": {
"command": "/absolute/path/to/flick/.venv/bin/flick",
"env": {
"JELLYFIN_URL": "http://localhost:8096",
"JELLYFIN_API_KEY": "your-key-here"
}
}
}
}Hermes agent
Add a mcp_servers entry to your Hermes config (e.g. ~/.hermes/config.yaml):
mcp_servers:
flick:
command: /home/lappy/repos/flick/.venv/bin/flick
env:
JELLYFIN_URL: http://localhost:8096
JELLYFIN_API_KEY: your-key-hereThen restart the agent and ask: "search my Jellyfin library for 'matrix'" or "what's playing on Jellyfin right now?"
API
Each tool maps to one Jellyfin REST endpoint:
Tool | Endpoint |
|
|
|
|
|
|
|
|
|
|
Auth: every request sends
X-Emby-Token: <api key>.Errors: non-2xx responses and network failures raise
flick.jellyfin.JellyfinErrorwith the HTTP status and reason in the message.The client (
flick/jellyfin.py) is standalone: use it from scripts withJellyfinClient(base_url, api_key)— no MCP required.
Roadmap
Playback control: play / pause / stop on a session
Queue & playlist management (add to playlist, reorder, clear queue)
Library browsing with filters (type, genre, year, sort)
User-scoped queries (
userIdpassthrough fornext_upand friends)Streamable HTTP transport for remote servers
Contributing
PRs are welcome. Keep it boring:
no new runtime dependencies (stdlib
urllibfor HTTP,mcpfor the server);tests use stdlib
unittestwith the HTTP layer mocked — run them with.venv/bin/python -m unittest discover -s tests -v;never commit secrets or real API keys.
License
MIT — see LICENSE. Copyright (c) 2026 Manny7717.
Available Tools
5 toolsinfoA
Return full metadata for a single library item by its Jellyfin item ID.
| Name | Required | Description | Default |
|---|---|---|---|
| item_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It clearly states the operation is a metadata retrieval, but it does not mention behavior on invalid IDs, authentication requirements, or what 'full metadata' includes. The output schema covers return shape, so the gap is moderate rather than severe.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that communicates the action, target, and required identifier with no wasted words. Every element earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple get-by-ID tool with one required parameter and an output schema, the description covers the essential invocation context. It does not discuss error handling or exclusions, but given the low complexity and existing output schema, it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does by clarifying that item_id is the Jellyfin item ID and that it identifies a single library item, adding meaning beyond the schema's minimal 'Item Id' title. It does not specify format details, but for a single simple parameter this is adequate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses a specific verb ('Return') with a clear resource ('full metadata for a single library item') and the exact identifier ('Jellyfin item ID'). It clearly differentiates from siblings such as search, sessions, libraries, and next_up, which serve different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the appropriate use case: call this when you already have a Jellyfin item ID and need full metadata. However, it does not explicitly state when not to use it or mention alternatives such as search for finding IDs first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
librariesA
List the top-level media libraries (Movies, TV Shows, ...).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the behavioral burden. It clarifies that only top-level libraries are returned, avoiding confusion with nested items. The verb 'List' implies a read-only, non-destructive operation. No side effects or permissions are mentioned, but none are needed for such a straightforward listing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence. It includes a specific verb, the target resource, and clarifying examples without any filler. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-argument tool with an output schema present, the description is functionally complete. It defines the operation and scope clearly. It could optionally mention that the returned libraries can be used as inputs to search or info, but this is not necessary for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, and schema description coverage is 100% (vacuously). Per the baseline for 0-parameter tools, a score of 4 is appropriate because there are no parameter semantics to add.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and a clear resource ('top-level media libraries') with illustrative examples (Movies, TV Shows). It is immediately distinguishable from sibling tools like search, info, sessions, and next_up, which all describe different operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes it clear that this tool is used when you need the list of top-level media libraries. There is no explicit mention of alternatives or when-not-to-use, but the imperative phrasing and resource specificity provide clear context without ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
next_upB
List the next unwatched episode for shows you are following.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It communicates a non-mutating 'list' operation and the scope of results, which is basic transparency. However, it does not disclose how 'next' is determined, whether the result is one episode per show, or any session/authentication requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no redundant words. Every part of the description contributes meaning, making it an excellent example of concise tool documentation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and has an output schema, so the description covers the core purpose adequately. However, the complete absence of parameter guidance and usage alternatives leaves gaps that an agent would need to resolve through inference or trial.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not mention the 'limit' parameter at all. Since the description was expected to compensate for the schema's lack of parameter documentation, this is a significant gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and a precise resource ('the next unwatched episode for shows you are following'). This clearly distinguishes it from siblings like search, info, sessions, and libraries, none of which cover this specific function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states what the tool does but gives no guidance on when to prefer it over alternatives, nor any exclusions or context about typical scenarios. The intended use case is only implied by the description itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchB
Search the Jellyfin library by title. Returns movies, shows, episodes, and more.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only says the tool 'Returns movies, shows, episodes, and more,' which is minimal. It does not mention whether the operation is read-only, whether authentication is required, how matching works, or behavior on empty/no results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundant filler. Every word contributes to the core meaning, though 'and more' is slightly vague. It is concise and appropriately scoped for a simple search tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter search tool, the description plus input schema provide a minimally viable picture: a required query and an optional limit with default. However, it lacks information about query syntax, search scope details, and when to prefer a sibling tool. The presence of an output schema reduces the need to explain return values, but usage and parameter guidance remain thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the schema's silence. It adds some meaning by indicating the query is a title search, but it does not explain the 'limit' parameter, acceptable query formats, search behavior, or result ordering. The description only partially clarifies the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Search') and resource ('the Jellyfin library') and clarifies that search is by title. It also indicates the result types (movies, shows, episodes), which helps distinguish it from sibling tools like info, sessions, libraries, and next_up. It is clear, though it does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool should be used when an agent needs to find library items by title. However, it provides no explicit guidance about when not to use it or which sibling tool might be a better fit for non-title searches. Usage context is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sessionsA
List active playback sessions: who is watching what, on which device.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 'List' clearly signals a read-only operation, and the scope is explicitly defined. However, it does not disclose potential limitations such as filtering scope, real-time freshness, or behavior when no sessions are active.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler. The verb is front-loaded, and the descriptive qualifiers add meaning without bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple parameterless listing tool with an output schema available, so the description does not need to document return values. It provides enough context to invoke the tool, though slightly more usage context would improve it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema coverage is 100%, so there is nothing for the description to explain. The baseline of 4 applies because parameter semantics are irrelevant here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and a specific resource ('active playback sessions'), then adds useful detail about what is included: who is watching, what they are watching, and on which device. This clearly distinguishes it from sibling tools like search or info.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The wording implies use when an agent needs current playback session information, but it does not explicitly say when to prefer this over sibling tools or when not to use it. No alternatives or exclusions are mentioned, leaving some selection to inference.
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. Dates show when Glama detected each change.
5 tool updates
v0.1.0- First observed
info - First observed
libraries - First observed
next_up - First observed
search - First observed
sessions
TDQS
Each tool has a clearly distinct responsibility: searching media, fetching metadata by ID, listing active sessions, listing top-level libraries, and showing next-up episodes. Search and info are related but role-separated by ID lookup, so an agent is unlikely to confuse them.
The names are readable and all lowercase, but they are not pattern-consistent: search is a verb while info, sessions, and libraries are nouns, and next_up uses an underscore while the others do not. A uniform list_/verb_noun convention would make the set more predictable.
Five tools is a well-scoped size for a focused Jellyfin browsing server. Each tool covers a meaningful high-level capability without overwhelming the agent with redundant operations.
The core read-only workflows for a Jellyfin assistant are covered: search, details, library listing, active sessions, and next episodes. Obvious minor gaps include browsing seasons/episodes within a show and playback controls, but these are not severe for the apparent purpose.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
The media memory layer for AI agents and their humans. Your AI client gets 29 tools to search your collection, add items, update ratings, preview music, and find patterns across everything you've read, watched, and listened to.
- AchriomOAuthcom.achriom
Media memory for AI agents and their humans: books, movies, music, shows, anime, podcasts, games.
15 media & data tools for AI agents: search, transcribe, subtitles, voiceover, translate & more.
Browse, search, rename, and favorite your Tolstoy media library from any AI client.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP (Multi-Agent Conversation Protocol) Server that enables interaction with Jellyfin media server APIs, auto-generated using AG2's MCP builder based on the Jellyfin OpenAPI specification.1-
- FlicenseNot gradedqualityCmaintenanceEnables interaction with Jellyseerr media request systems through natural language. Supports searching for media, creating requests, checking request status, and managing your media library workflow.8-
- AlicenseAqualityAmaintenanceEnables AI assistants to interact with Overseerr for automated media discovery, requests, and management in your Plex ecosystem, including searching for movies/TV shows, requesting media, checking request status, and managing approvals.634421MIT
- AlicenseNot gradedqualityDmaintenanceConnects an Emby media server to AI clients like Claude Desktop, enabling natural language control of media playback, library browsing, playlist management, and search across your personal media collection.9GPL 3.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/Manny7717/flick'
If you have feedback or need assistance with the MCP directory API, please join our Discord server