simkl-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SIMKL_AUTH_PATH | Yes | Path to the simkl_auth.json file containing the Simkl token (used to authenticate requests). |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| login_statusA | Whether this server holds a usable Simkl token, without revealing it. |
| logoutA | Delete the stored Simkl token from this machine. This does not revoke the app on Simkl's side -- do that at simkl.com/settings/apps. |
| get_activitiesA | Timestamps of the user's most recent list changes. The cheapest call in the API and the gate for every sync: if |
| get_libraryA | Read the watch history and watchlists. type: shows, movies or anime. Omit for all three in one call. status: watching, plantowatch, hold, completed or dropped. Omit for all. date_from: an ISO timestamp from get_activities, passed back byte-for-byte. With it you get only what changed since; without it, the full library. Deletions never appear in a delta. When activities' Returns normalized items plus |
| get_library_idsA | Every Simkl ID in the library, and nothing else. The cheap half of deletion reconciliation: IDs present locally but absent here have been removed from Simkl, and any rating stored for them is gone too (Simkl wipes the rating on removal). |
| lookup_watchedA | Ask Simkl directly whether specific titles are already in the library. items: a list like [{"simkl": 54130}, {"imdb": "tt0110912"}] -- any mix of supported ID keys. Simkl returns a parallel array with each item's library status and last-watched time. This is the server-side check behind re-com-video's "never already seen" guarantee. It is independent of the local mirror, so it catches anything watched since the last sync. |
| get_ratingsA | The titles the user has rated themselves. type: movies, shows or anime. rating: 1-10, or omit for every rating. Ratings 8-10 are the strong positive seeds for "what should I watch tonight"; 1-4 are the negative signal (PLAN.md 5.1). |
| get_titleA | Full detail record for one title, including its viewer-based neighbours. type: movie, tv or anime -- Simkl's own classification, which can change for a given title; follow it rather than assuming. The record carries |
| resolve_idB | Turn an external ID into a Simkl ID -- the cheapest way in. A TMDB ID needs Reads the 301's Location header without following it, as Simkl requires. |
| searchA | Search Simkl by title. type: movie, tv or anime. Omit to search everything. Titles collide constantly -- "The Bear" is seven distinct works. Treat every result as a candidate to disambiguate by year and type, never as the answer. Prefer resolve_id whenever an external ID is available. |
| mark_watchedA | Record that the user watched these titles. items: [{"ids": {"simkl": 54130}}, ...]. Add "watched_at" (ISO, UTC) if the date is known; omit it for "now". For "a long time ago, don't remember", Simkl's placeholder is 1970-01-01T00:00:01Z -- store that, and never display it as a literal 1970 date. type: movie, tv or anime. Anime goes in the shows[] envelope. Simkl serialises sync writes per user behind a 20-second lock, so batch rather than sending one call per title. |
| set_statusA | Move titles into a watchlist status. status: watching, plantowatch, hold, completed or dropped. Two behaviours worth knowing: movies have no |
| rateB | Rate titles 1-10. Rating something that is on no list auto-files it: a released movie becomes completed, an unreleased one plan-to-watch, a single-episode show completed, anything else watching. That move is intended -- read the next delta as authoritative rather than trying to predict it. |
| remove_from_historyA | Remove titles from the watch history. Removing an item also wipes its Simkl rating. Anything removed here stops being excluded from recommendations, which is usually the point. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 14 tools
Each tool has a clearly distinct purpose: auth (logout, login_status), library retrieval (get_library, get_library_ids, lookup_watched), title info (get_title, search, resolve_id), write actions (mark_watched, set_status, rate, remove_from_history), and sync support (get_activities, get_ratings). Even similar tools like get_library vs get_library_ids are explicitly differentiated by intent (full data vs ID-only for deletion reconciliation).
All tool names follow a consistent snake_case verb-noun pattern (e.g., get_activities, mark_watched, resolve_id). Verbs are uniform across CRUD-like operations, and even standalone verbs like 'search' and 'rate' fit the pattern. No mixed conventions or ambiguous naming.
14 tools is well-scoped for a media library sync and recommendation server. Each tool fills a clear role—auth, reading, writing, ID resolution, and search—without redundancy. The count is neither bloated nor insufficient, covering the full integration surface.
The tool surface covers the entire lifecycle: login status, library synchronization with delta support, deletion reconciliation, direct watched-check, ratings, title details, ID resolution, search, and all write operations (mark, status, rate, remove). No obvious gaps for the stated purpose of powering a recommendation system.