simkl-mcp
Allows reading and managing a user's Simkl watch history, library, and ratings, including searching titles, resolving external IDs, logging watched items, updating statuses, and rating titles.
Click on "Deploy 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., "@simkl-mcpWhat have I watched recently?"
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.
simkl-mcp
An MCP server wrapping the Simkl API, so Claude can read your watch history and log what you've watched.
This is the only place a Simkl token lives. re-com-video
— the recommendation engine — is read-only and calls these tools rather than holding a
credential itself, so a recommender can never be the thing that also mutated the history it
claims to have excluded.
Tools
Reading
Tool | Does |
| Whether a usable token is stored. Never returns the token. |
| Timestamps of the user's most recent list changes. The cheapest call in the API, and the gate for every sync. |
| Watch history and watchlists, normalized. With |
| Every Simkl ID and nothing else — the cheap half of deletion reconciliation. |
| Ask Simkl directly whether specific titles are already in the library. |
| The titles the user rated themselves. |
| Full detail record, including |
| External ID → Simkl ID. |
| Search by title. Use |
Writing
Tool | Does |
| Record watch events. |
| Move titles to |
| Rate 1–10. |
| Remove from history. Also clears the item's rating. |
| Delete the local token. |
Related MCP server: Fathom AI MCP Server
Setup
python3 -m venv .venv && source .venv/bin/activate
pip install -e .Register a free app at simkl.com/settings/developer. The
PIN flow needs no client_secret and no redirect URI, so the redirect URI field can be anything
(urn:ietf:wg:oauth:2.0:oob is conventional).
python scripts/setup_auth.py --client-id YOUR_CLIENT_IDIt prints a five-character code; enter it at simkl.com/pin. The token is
written to simkl_auth.json (mode 600, gitignored). Simkl issues no refresh token — the
token lasts about five years, and a 401 means the app was revoked at
simkl.com/settings/apps.
Register as an MCP server:
{
"mcpServers": {
"simkl": {
"command": "/path/to/simkl-mcp/.venv/bin/python",
"args": ["/path/to/simkl-mcp/server.py"],
"env": { "SIMKL_AUTH_PATH": "/path/to/simkl-mcp/simkl_auth.json" }
}
}
}Tests
pip install -e ".[dev]" && python -m pytest tests -qNo network and no token required — every HTTP call is faked.
What this server is careful about
Simkl's API has a handful of behaviours that fail quietly, which is the class of bug this project is built to avoid. Each is handled here and has a test:
Anime entries nest under
show, notanime. Reading the wrong key silently returns an empty anime library — and an exclusion gap nothing would notice.Browse filters silently widen. An unrecognised
typeorstatussegment is treated as "all" and still returns200. This server rejects unknown filter values instead of sending them.Movies have no
watchingorholdstatus. Refused up front rather than silently ignored.TMDB IDs are not unique across movie and TV.
resolve_idrefuses a TMDB ID without a type.Slugs are not unique (three different Superman films share one), so links are built from the Simkl ID.
/redirectmust not be followed. TheLocationheader is the whole answer; the destination is HTML.The PIN
device_codeis the literal string"DEVICE_CODE"— a placeholder. Polling usesuser_code, and stops at the first token (Simkl deletes an approved code, and polling an unknown one falls through to issuing a new code).Deltas never contain deletions.
get_library(date_from=…)says so in its response.History rows with no Simkl ID are counted, not dropped.
skipped_without_simkl_idis part of every library response.
Simkl's terms
Free for non-commercial and personal projects. Every request sends client_id, app-name,
app-version and a User-Agent, as required, and every title this server returns carries a link
back to its Simkl page. See api.simkl.org/api-rules.
License
MIT
Available Tools
14 toolsget_activitiesA
Timestamps of the user's most recent list changes.
The cheapest call in the API and the gate for every sync: if all has not
moved since the last recorded value, nothing needs fetching.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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, the description carries the behavioral burden. It adds meaningful context beyond the schema: this is intentionally cheap, acts as a sync gate, and its `all` value indicates whether changes occurred. It does not discuss auth or rate limits, but the read-only and lightweight nature is strongly implied.
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?
Two short sentences with no filler. The core purpose is front-loaded, and the second sentence earns its place by explaining the tool's strategic role in syncing.
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 zero-parameter tool with an output schema available, the description is complete enough. It tells the agent what the tool provides, why it should be called, and how to interpret the key signal (`all`) to decide whether further fetching is needed.
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, so there is no parameter ambiguity. Baseline for zero-parameter tools is 4, and the description's mention of `all` refers to the response payload rather than input, which is appropriate.
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 clearly identifies the resource and output: timestamps of the user's most recent list changes. It is not a tautology and is easily distinguished from sibling tools like get_library or get_ratings, though it uses a noun phrase rather than an explicit verb like 'returns'.
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 explicitly frames the tool as 'the cheapest call in the API' and 'the gate for every sync,' telling the agent exactly when to invoke it. It also gives a concrete when-not condition: if `all` has not moved, nothing needs fetching.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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' removed_from_list
moves, call get_library_ids and diff instead.
Returns normalized items plus skipped, the number of entries that carried
no Simkl ID. A non-zero skipped is a hole in the exclusion guarantee and
must be reported to the user, not hidden.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | ||
| status | No | ||
| date_from | No |
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, the description carries full burden and it delivers: it discloses the deletion-never-in-delta limitation, the skipped counter semantics, and the obligation to surface non-zero skipped to the user. It also defines the read-only nature by its opening verb.
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 compact and front-loaded: purpose first, then each parameter, then caveats. Every sentence adds operational value; no filler or repetition.
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 read tool with a present output schema, the description covers the non-obvious behavior (deltas, deletions, skipped holes) that the schema cannot convey, and gives enough parameter detail to make the correct call without external lookup.
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 coverage is 0% and there are no enums, yet the description fully documents all three parameters: valid values for type, valid statuses, omission behavior, and the exact date_from contract ('ISO timestamp from get_activities, passed back byte-for-byte').
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?
Opens with 'Read the watch history and watchlists,' a specific verb plus resource that immediately distinguishes this from sibling tools like get_activities (activity log) and get_library_ids (ID diffing). The rest of the description reinforces the scope with filtering dimensions.
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?
Explicitly explains the delta mode ('With it you get only what changed since; without it, the full library') and gives a when-not condition: 'Deletions never appear in a delta... call get_library_ids and diff instead.' This is actionable routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| type | No |
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, the description carries the full burden of behavioral disclosure. It goes beyond the schema by revealing that absent IDs are equivalent to removal and that Simkl wipes stored ratings on removal, which is valuable behavioral context. It does not mention auth or rate limits, but those are less critical for this simple read-style tool.
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 two crisp sentences with no fluff. The core purpose is front-loaded, and the deletion-reconciliation context is provided in a compact supporting sentence.
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 main behavioral context and interpretation rules well. The only real gap is the unexplained 'type' parameter, which prevents a fully self-sufficient definition.
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 single optional 'type' parameter has no schema description (0% coverage) and the description never mentions it. The agent is left without guidance on what values it accepts or how it affects the returned IDs, so the description does not compensate for the schema 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 states a specific verb-resource pair: returns every Simkl ID in the library, and explicitly narrows scope with 'and nothing else.' This clearly distinguishes it from the sibling get_library tool, which presumably returns fuller library objects.
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 gives a concrete use case—'the cheap half of deletion reconciliation'—and explains how to interpret missing IDs. It does not explicitly mention when not to use it or name an alternative, but the context is strong enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | ||
| rating | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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. It discloses that it returns self-ratings and explains the rating scale meaning, which is useful. However, it does not mention pagination, ordering, authentication requirements, or side effects (though likely none). It does provide insight into how the output should be interpreted, which adds behavioral context. Overall, adequate but not comprehensive for a getter with no annotation coverage.
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?
Three concise sentences: purpose, parameter usage, and rating interpretation. The purpose is front-loaded, and each sentence adds distinct value without redundancy. No wasted words or filler. Efficient and well-structured.
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?
Given an output schema exists, the description need not detail return format. It covers both parameters, their allowed values, and optionality, and adds interpretive guidance. It is sufficient for an agent to call the tool correctly. Minor omission: exact string casing for type values (e.g., 'movies' vs 'movie'), but likely implied. Overall, complete enough.
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 descriptions are completely absent (0% coverage), so the description must compensate. It clearly explains the 'type' parameter values (movies, shows, anime) and the 'rating' parameter range (1-10) and optionality (omit for all). It adds semantic meaning to rating values as positive/negative signals, going beyond simple type definitions. This is strong parameter documentation.
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 clearly states the tool retrieves titles the user has rated, specifying the resource and scope. It does not explicitly differentiate from sibling tools like get_library or lookup_watched, but the resource is distinct enough that an agent can infer its purpose. The note about ratings as positive/negative seeds adds context but does not aid sibling differentiation.
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 explains parameter usage (type and rating) but lacks explicit when-to-use vs alternatives. It does not say 'use this when you need the user's ratings for recommendations' or exclude other tools. The rating semantics provide interpretive guidance, not tool-selection guidance. The usage is implied from the purpose, not explicitly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 users_recommendations: titles suggested from what this
title's viewers also watched. That is the viewer signal re-com-video ranks
on, and the count varies enormously by title.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | ||
| simkl_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, the description carries the full burden. It explains the mutable nature of the type field and the users_recommendations field, but does not explicitly state that it is a read-only operation, nor does it cover error cases or authentication requirements. The output schema covers return structure, so that is acceptable.
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 concise, using three sentences with no fluff. It front-loads the purpose, then clarifies the type field and mentions the recommendations field. The structure is logical and easy to scan.
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 tool with two parameters and an output schema, the description covers the essential aspects: the return scope and the type semantics. However, it omits any mention of prerequisites like authentication or how the simkl_id should be obtained, which could leave an agent uncertain about the full calling context.
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 thoroughly explains the type parameter (movie, tv, anime, and its changeable nature), but gives no additional detail about simkl_id beyond its name. The ID is self-explanatory, but the description does not clarify how to obtain it or its format.
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 clearly states the tool returns a 'full detail record for one title' including viewer-based neighbors. It distinguishes itself from sibling tools by focusing on a single title's complete record, and the type field clarification adds specificity.
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 provides guidance on the type parameter, advising to follow Simkl's classification rather than assume. However, it does not explicitly mention when to use this tool versus alternatives like search or resolve_id, nor does it state any prerequisites such as needing a simkl_id from another endpoint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
login_statusA
Whether this server holds a usable Simkl token, without revealing it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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, the description carries the burden of behavioral disclosure. It usefully notes that the token is not revealed, and 'whether' implies a read-only status check, but it does not explicitly state that no token data is returned or that no side effects occur.
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 clear sentence with no filler. The most important facts—status check and token non-revelation—are both present and front-loaded.
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 zero-parameter status check with an output schema, the description is largely sufficient. It lacks explicit usage context, but nothing about inputs or return values is missing given the output schema exists.
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, so parameter semantics are not a concern. The description correctly communicates that no inputs are needed and does not need to compensate for undocumented 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 states the tool reports whether the server has a usable Simkl token, which is a specific status check resource. It is distinguishable from sibling tools that mutate or query library data, though it uses a copular 'whether' construction rather than an explicit verb.
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 intended use is implied: call this to check authentication status before using Simkl-backed tools. There is no explicit guidance on when to use it instead of logout or other auth-related operations, and no exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| 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?
With no annotations, the description carries the full burden and does it well: it states the local side effect clearly and explicitly discloses the non-revocation limitation. This is exactly the kind of non-obvious behavioral context an agent needs.
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?
Two short sentences with no filler. The main purpose is front-loaded, and the important caveat about remote revocation follows immediately.
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 zero-parameter local logout action with an output schema and simple behavior, the description covers everything necessary: what happens locally, what does not happen remotely, and where to go for the stronger action.
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?
There are zero parameters and the schema fully covers this. The description adds nothing about parameters, but none is needed; baseline for zero-parameter tools applies.
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 and resource: deleting the stored Simkl token from this machine. This clearly distinguishes the tool from generic 'logout' and from sibling tools like remove_from_history or login_status.
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?
Explicitly explains that this does not revoke the app on Simkl's side and directs users to simkl.com/settings/apps for that action. This provides a clear exclusion and an alternative, though it does not discuss in-tool alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes |
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 disclosure burden and does well: it states this queries Simkl directly, returns a parallel array with library status and last-watched time, and is independent of the local mirror. It does not cover error cases or authentication, but the key behavioral traits are disclosed.
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 compact and well ordered: purpose, input format, output behavior, then rationale. Every sentence adds useful information, and there is no redundant filler.
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 has only one parameter, the description explains its shape and the output in broad terms, and an output schema exists so return details need not be repeated. It is complete enough for selection and invocation, though minor edge-case behavior such as invalid ID keys is not addressed.
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 coverage is 0%, so the description must compensate, and it does. It explains that 'items' is a list, shows an exact example with simkl and imdb ID keys, and clarifies that any mix of supported ID keys is accepted. This goes well beyond the minimal array-of-objects schema.
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 opens with 'Ask Simkl directly whether specific titles are already in the library,' a specific verb and resource. It further distinguishes itself by noting this is a server-side check independent of the local mirror, separating it from sibling tools like get_library and get_library_ids.
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 gives clear usage context: it is the server-side check behind the 'never already seen' guarantee and is independent of the local mirror, catching activity since the last sync. It implies when to prefer this tool over local-mirror lookups, though it does not explicitly name alternatives or say when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | ||
| items | 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, the description must carry behavioral disclosure. It does reveal the 20-second serialization lock, the placeholder handling for 'long ago', and the anime envelope rule. However, it omits whether the operation is destructive, requires auth, or is reversible, leaving gaps for a mutation tool.
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 compact and front-loaded with a clear purpose sentence, then structured details. Each sentence adds value—format, type rules, and batching advice—with no fluff. It's slightly dense but efficient.
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?
Given the minimal schema and lack of annotations, the description covers the essential input format, special cases, and operational constraints. An output schema exists, so return format is covered. It could mention error handling or overwrite behavior, but the core usage is adequately specified.
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 coverage is 0% and the description fully compensates. It explains type values (movie, tv, anime), the items array structure with ids and watched_at, and the 1970-01-01T00:00:01Z placeholder. This adds substantial meaning beyond the bare schema.
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 clear action (record watched titles) with a specific resource (user's watch history). It's not a tautology and is distinguishable from siblings like set_status or rate, though it doesn't explicitly contrast them.
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 provides no guidance on when to use this tool versus alternatives. It only gives operational details (format, batching) and never mentions exclusions or comparisons to sibling tools like set_status or remove_from_history.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | ||
| items | Yes | ||
| rating | 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, the description carries the burden of disclosing side effects. It explicitly states that rating an item not on a list auto-files it, and details the mapping for different content types. The warning to trust the response rather than predict the delta adds useful transparency. However, it does not cover behaviors for already-rated items, permissions, or reversibility.
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 concise, with the primary purpose front-loaded in the first sentence. The subsequent sentences add necessary behavioral context without excessive verbosity. It could be slightly more structured, but it is efficient and readable.
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?
Given the tool's complexity (mutation with side effects), the lack of annotations, and zero schema coverage, the description is incomplete. It does not explain parameter semantics, what the output schema will contain, error conditions, or prerequisites like authentication. The warning about the delta hints at a response but does not describe 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?
Schema description coverage is 0%, so the description must explain the parameters, but it does not. It only hints at the rating range ('1-10') and says nothing about the structure of 'items' or the meaning of 'type'. The agent is left without essential information to construct valid arguments.
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 opens with a specific verb and resource: 'Rate titles 1-10.' It also discloses a key side effect (auto-filing) that distinguishes this from sibling tools like get_ratings (read-only) or set_status (explicit status change). The purpose is unambiguous and differentiated.
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 explains a behavioral consequence (auto-filing) but provides no explicit guidance on when to use this tool versus alternatives. It does not mention set_status or mark_watched, nor does it state conditions for choosing this tool over them. The context is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | ||
| items | 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 full burden and does disclose two important side effects: wiping the Simkl rating and re-enabling recommendation inclusion. It does not mention permanence or authorization requirements, but the key destructive consequence is clearly stated.
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?
Three short sentences with the primary action stated first and necessary caveats following. Every sentence earns its place and there is no repetition or filler.
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 description covers the core behavior and important side effects, and an output schema exists so return values need not be explained. However, the required parameters are not documented enough for a fully reliable call, leaving a notable gap in self-sufficiency.
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 description only implies that the items are 'titles,' giving a small hint toward the items parameter. It provides no guidance on the required 'type' value or the object shape for each item, and with 0% schema description coverage and no enums, the agent is left to guess.
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 and resource: remove titles from watch history. The added side-effect details further clarify what the tool uniquely does, distinguishing it from read-only or status-setting sibling tools.
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 gives clear practical context: removing items stops them from being excluded from recommendations, which is usually the point of using this tool. It does not explicitly name alternatives or say when not to use it, but the intended use case is evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_idB
Turn an external ID into a Simkl ID -- the cheapest way in.
A TMDB ID needs type ('movie' or 'show'): TMDB IDs are not unique across
movies and TV, so a bare TMDB ID is ambiguous and is refused here.
Reads the 301's Location header without following it, as Simkl requires.
| Name | Required | Description | Default |
|---|---|---|---|
| mal | No | ||
| imdb | No | ||
| tmdb | No | ||
| type | No | ||
| netflix | No |
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, the description carries the behavioral-disclosure burden. It adds useful non-obvious behavior by explaining the redirect handling ('Reads the 301's Location header without following it') and the TMDB ambiguity refusal, but it does not mention authentication, rate limits, or other potential side effects, so it is not fully transparent.
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 compact and well front-loaded: the one-line purpose comes first, followed by necessary caveats about TMDB IDs and redirect behavior. Each sentence contributes meaning, though 'the cheapest way in' adds only mild informational value.
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?
Given five optional parameters, no schema descriptions, and no annotations, the description should clarify how to supply mal/imdb/netflix IDs and what happens when multiple IDs are provided. It only covers the TMDB+type scenario, leaving significant input-side gaps; the output schema helps but does not resolve these.
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, but it only explains `tmdb` and `type`. The `mal`, `imdb`, and `netflix` parameter formats, mutual exclusivity, and selection precedence are not addressed, leaving most parameters underspecified.
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 clearly states the tool's action and result: 'Turn an external ID into a Simkl ID -- the cheapest way in.' It identifies a specific verb and resource, but it does not explicitly differentiate from sibling tools such as search or get_library_ids.
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 provides one concrete usage rule: a TMDB ID requires `type` ('movie' or 'show') because a bare TMDB ID is ambiguous and refused. It implies this is the cheapest resolution path, but it does not explicitly say when to prefer this tool over alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | ||
| 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?
With no annotations provided, the description carries full behavioral burden. It discloses key behavioral traits: title collisions are common, results are candidates, and disambiguation by year and type is required. It does not mention limit behavior or rate limits, but the output schema covers return structure and this is a read-only search operation.
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 tight and front-loaded: a clear one-line purpose, followed by parameter nuanceable, then a concrete caution about ambiguity. Every sentence earns its place without redundancy.
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 description is complete for a search tool with an output schema. It explains the input semantics, warns about ambiguity, mandates disambiguation, and routes to resolve_id when appropriate. Nothing essential is missing 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?
Schema description coverage is 0%, so the description must compensate. It does add meaning for 'query' ('by title') and for 'type' (enumerates values and explains omission behavior). 'limit' is not explicitly described, but its standard meaning and default of 10 make this a minor 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 opens with a specific verb and resource: 'Search Simkl by title.' It clearly distinguishes this tool from sibling resolve_id by framing search as title-based lookup rather than external-ID lookup.
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?
It provides explicit usage context: type can be 'movie, tv or anime' or omitted to search everything. It also tells the agent to treat every result as a candidate to disambiguate, never as the final answer, and names resolve_id as the preferred alternative when an external ID is available.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_statusA
Move titles into a watchlist status.
status: watching, plantowatch, hold, completed or dropped.
Two behaviours worth knowing: movies have no watching or hold, and
writing completed for a still-airing show silently becomes watching.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | ||
| items | Yes | ||
| status | 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, the description carries the full burden and it delivers two genuinely useful behavioral disclosures: movies do not support watching/hold, and completed silently becomes watching for still-airing shows. This goes well beyond the schema, though it omits details like overwrite behavior, permissions, or return semantics.
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 compact and well-fragmented into purpose, valid values, and edge cases. Every sentence adds value, and the most important behavioral caveats are clearly highlighted.
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 description covers status values and notable edge behavior, giving an agent useful invocation context despite the opaque schema. It is not fully complete because the type parameter is unexplained and there is no guidance on the shape or required fields of items, so an agent may still guess incorrectly on first call.
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 description adds meaning to the status parameter by listing valid values, which the schema does not provide. But it says nothing about the required type parameter or how items should be structured, leaving significant parameter semantics uncovered at 0% schema coverage.
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 action ('Move titles into a watchlist status') and lists the valid status values, making the resource and operation clear. It does not explicitly contrast itself with siblings like mark_watched, but the 'watchlist status' framing distinguishes it from related tools.
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 the intended use context clear: updating a title's watchlist status. However, it does not state when to prefer this tool over siblings such as mark_watched or remove_from_history, nor does it mention any exclusions or prerequisites.
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.
14 tool updates
v0.1.0- First observed
get_activities - First observed
get_library - First observed
get_library_ids - First observed
get_ratings - First observed
get_title - First observed
login_status - First observed
logout - First observed
lookup_watched - First observed
mark_watched - First observed
rate - First observed
remove_from_history - First observed
resolve_id - First observed
search - First observed
set_status
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.
Maintenance
Related MCP Connectors
Connect Claude to Fathom meeting recordings, transcripts, and summaries
Connect Claude to your Intervals.icu watch data for fitness, workout review, and plan writing.
- platform7nOAuthtech.p7n
Connect Claude to your Platform7n workspaces — chat, links, and tasks. One-click OAuth.
WHOOP recovery, strain, sleep and workouts in Claude via official WHOOP OAuth. Free, open source.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables full management of a Plex Media Server via Claude, including browsing libraries, fixing metadata, managing collections, and more.-
- AlicenseNot gradedqualityBmaintenanceEnables Claude to access your Fathom meetings, transcripts, and AI summaries.11 npm16MIT
- FlicenseAqualityDmaintenanceProvides Claude AI with direct access to The Movie Database (TMDB) for searching movies, trending content, and reviews through natural language.6-
- AlicenseNot gradedqualityCmaintenanceEnables starting and stopping Clockify timers, checking the currently running timer, and viewing recent time entries via Claude.MIT