Creators & communities
Substack
Posts, Notes, messages, subscribers and stats for your publication.
50 endpoints
Your AI agent checks the Watchlist against your libraries, marks finished series watched, builds playlists and invites friends to the libraries you pick, with your OK before anyone is invited. Sign in to Plex once in your own Cloud Browser. No token to dig out and no server code to run.
14 tools Read and write
Plex has a documented HTTP API for Plex Media Server and no official MCP server (checked 6 Nov 2026). The API needs an X-Plex-Token and your own code. Cotlet runs 14 Plex tools hosted, 6 of them writes, over MCP for agents and REST for scripts.
| What you need | Plex server API | Community MCP server | Cotlet |
|---|---|---|---|
| Browse and search your libraries | Yes, with your code | Yes | Yes |
| Mark items watched or unwatched | Yes, with your code | Yes | Yes |
| Playlists and collections | Yes, with your code | Yes | Yes |
| Add and remove Watchlist titles | Not in the docs | In some | Yes |
| Invite someone to your libraries | Not in the docs | In one | Yes, after your OK |
| What it takes to start | Token and a developer | Install, token, keep it running | Your Plex login |
| Works inside the ChatGPT and Claude apps, always on | No, code only | If you put it online | Yes, hosted |
Checked 6 Nov 2026. Sources: Plex Developer: Plex Media Server API · Plex Support: Managing Library Access · Plex Support: Webhooks · GitHub: vladimir-tutin/plex-mcp-server · GitHub: dustinhansen/plex-mcp
Once, in a browser we host for you.
Add one address to its settings.
It does the clicks, you OK any invite.
We never keep your Plex password, and no library invite goes out until you approve it. Who can see your session
Enable Plex for agents. Create a Cotlet account, sign in to Plex in its Cloud Browser, then press Enable for agents.
Add the Cotlet address. Enter https://cotlet.dev/mcp/v1 in your agent as a remote MCP server or custom connector.
Approve the link. Chat apps ask you to sign in to Cotlet once. Editors, n8n and scripts send an API key from the console.
https://cotlet.dev/mcp/v1 carries Plex next to your other apps. Library access tools work only when you sign in as the owner of the server; the Watchlist needs just your account. Refresh the connector after enabling Plex so the tools load.
Settings > Connectors > Add custom connector
URL: https://cotlet.dev/mcp/v1/connect
Claude Code:
claude mcp add --transport http cotlet-plex \
https://cotlet.dev/mcp/v1 \
--header "Authorization: Bearer $COTLET_API_KEY" Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth // ~/.cursor/mcp.json
{
"mcpServers": {
"cotlet-plex": {
"url": "https://cotlet.dev/mcp/v1",
"headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
}
}
} # ~/.codex/config.toml
[mcp_servers.cotlet-plex]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY" MCP Client Tool (inside an AI Agent)
Transport: HTTP Streamable
URL: https://cotlet.dev/mcp/v1
Auth: Bearer, <your key>
Tool: plex_read Make: MCP Client > Call a tool
Zapier: MCP Client by Zapier > Run Tool
Server URL: https://cotlet.dev/mcp/v1
Token: <your key>
Tool: plex_write Search covers your libraries only; a title that sits just on your Watchlist shows up in list_watchlist instead.
Returns every library you can see on the server you are signed in to, such as Movies, TV Shows or Music. Use library as the library parameter of the other tools. The count is the number of top-level items Plex Web shows for that library. It reads only; nothing changes in Plex.
MCP callplex_read → list_libraries
REST endpointGET https://cotlet.dev/api/v1/plex/libraries
No parameters.
{
"libraries": [
{
"library": "Movies",
"type": "Movies",
"items": 412
},
{
"library": "TV Shows",
"type": "TV Shows",
"items": 87
},
{
"library": "Music",
"type": "Music",
"items": 1560
}
]
} Lists the items of one library as Plex Web shows them, one page at a time. Pass next_cursor back as cursor for the next page. unwatched true keeps only titles you have not finished. item_id is the key for get_media_item, mark_watched and add_to_playlist. It reads only.
MCP callplex_read → list_library_items
REST endpointGET https://cotlet.dev/api/v1/plex/library-items
| Name | Type | Description |
|---|---|---|
| library string required | string | Library name as list_libraries returns it, e.g. 'Movies'. |
| unwatched boolean | boolean | True keeps only items you have not watched. |
| limit integer | integer | Items per page. |
| cursor string | string | Next page cursor from the previous call. |
{
"library": "Movies"
} {
"items": [
{
"item_id": "48213",
"title": "The Quiet Harbor",
"year": 2024,
"watched": false,
"added": "2026-10-28"
},
{
"item_id": "48190",
"title": "Night Ferry",
"year": 2023,
"watched": true,
"added": "2026-10-21"
}
],
"next_cursor": "2"
} Searches the libraries of your server for a title, the way the search box in Plex Web does. Each match carries its library, type and watched state. Leave library out to search all of them. A title that is only on your Watchlist and not in a library does not appear here; list_watchlist shows those.
MCP callplex_read → search_media
REST endpointGET https://cotlet.dev/api/v1/plex/medias/search
| Name | Type | Description |
|---|---|---|
| query string required | string | Title or part of a title. |
| library string | string | Search only this library. |
{
"query": "query"
} {
"results": [
{
"item_id": "48213",
"title": "The Quiet Harbor",
"type": "Movie",
"year": 2024,
"library": "Movies",
"watched": false
}
]
} Returns the details page of one item: summary, year, runtime, watched state and, for a show, its seasons and episodes with their own item_id. Use the episode ids with mark_watched. It reads only.
MCP callplex_read → get_media_item
REST endpointGET https://cotlet.dev/api/v1/plex/items/{item_id}/media-item
| Name | Type | Description |
|---|---|---|
| item_id string required | string | Item id from search_media or list_library_items. |
{
"item_id": "item_8c41d2"
} {
"item_id": "48290",
"title": "Salt Road",
"type": "Show",
"year": 2022,
"watched": false,
"summary": "A courier crosses a desert coast road one delivery at a time.",
"seasons": [
{
"item_id": "48291",
"title": "Season 1",
"episodes": 8,
"watched_episodes": 8
},
{
"item_id": "48299",
"title": "Season 2",
"episodes": 8,
"watched_episodes": 5
}
]
} Plex keeps movies and shows on the Watchlist, not single seasons or episodes. in_library says whether a title also sits on your server.
Lists the movies and shows on the Watchlist of the signed-in account. Plex keeps movies and shows on it, not single seasons or episodes. in_library is true when a title also sits in a library of your server. It reads only.
MCP callplex_read → list_watchlist
REST endpointGET https://cotlet.dev/api/v1/plex/watchlists
| Name | Type | Description |
|---|---|---|
| type enum | enum | movie or show. Default: both. |
{
"watchlist": [
{
"title": "Paper Lanterns",
"type": "Movie",
"year": 2025,
"in_library": false
},
{
"title": "Low Tide",
"type": "Show",
"year": 2024,
"in_library": true
}
]
} Adds one movie or show to the Watchlist of the signed-in account. Plex accepts movies and shows, not single seasons or episodes. A title already on the list is left alone. It reaches no one and is undone with remove_from_watchlist, so it does not wait for your OK.
MCP callplex_write → add_to_watchlist
REST endpointPOST https://cotlet.dev/api/v1/plex/watchlists
| Name | Type | Description |
|---|---|---|
| title string required | string | Title to add, e.g. 'Paper Lanterns'. |
| year integer | integer | Year of release, to pick the right title when two share a name. |
{
"title": "Paper Lanterns"
} {
"title": "Paper Lanterns",
"type": "Movie",
"on_watchlist": true
} Removes one movie or show from the Watchlist of the signed-in account. If the title is not on it, nothing changes. It reaches no one and is undone with add_to_watchlist, so it does not wait for your OK.
MCP callplex_write → remove_from_watchlist
REST endpointDELETE https://cotlet.dev/api/v1/plex/watchlists
| Name | Type | Description |
|---|---|---|
| title string required | string | Title to remove. |
| year integer | integer | Year of release, to pick the right title when two share a name. |
{
"title": "title"
} {
"title": "Low Tide",
"type": "Show",
"on_watchlist": false
} Smart playlists cannot be added to by hand, so add_to_playlist skips them. Give a season or show id to mark all its episodes at once.
Does what Mark as Watched and Mark as Unwatched do in Plex Web. Give a season or show id to change all its episodes at once. watched false marks it unwatched again. It changes only your own watched state and is undone with the same call, so it does not wait for your OK. Plex can drop a watched title from your Watchlist.
MCP callplex_write → mark_watched
REST endpointPOST https://cotlet.dev/api/v1/plex/items/{item_id}/watched/mark
| Name | Type | Description |
|---|---|---|
| item_id string required | string | Item id from search_media, list_library_items or get_media_item. |
| watched boolean required | boolean | True marks watched, false marks unwatched. |
{
"item_id": "item_8c41d2",
"watched": true
} {
"item_id": "48299",
"title": "Salt Road, Season 2",
"watched": true,
"episodes_changed": 3
} Returns the playlists of the signed-in account with their name, the kind of media they hold and how many items they contain. A smart playlist is marked smart: true; Plex does not let you add items to those by hand, so add_to_playlist skips them. It reads only.
MCP callplex_read → list_playlists
REST endpointGET https://cotlet.dev/api/v1/plex/playlists
No parameters.
{
"playlists": [
{
"playlist": "Rainy Sunday",
"type": "video",
"items": 9,
"smart": false
},
{
"playlist": "Recently added",
"type": "video",
"items": 24,
"smart": true
}
]
} Adds the items to the end of the playlist you name and creates the playlist if it does not exist. Plex does not allow adding by hand to a smart playlist, so the call fails with the playlist name. Items of different media types end up in separate playlists of the same name. A playlist is yours and reaches no one, so this call does not wait for your OK.
MCP callplex_write → add_to_playlist
REST endpointPOST https://cotlet.dev/api/v1/plex/playlists
| Name | Type | Description |
|---|---|---|
| playlist string required | string | Playlist name. |
| item_ids array required | array | Item ids from search_media or list_library_items. |
{
"playlist": "playlist",
"item_ids": "item ids"
} {
"playlist": "Rainy Sunday",
"added": 3,
"total_items": 12,
"created": false
} Returns the collections of one library, each with the titles it holds. Collections belong to the library and are visible to the people who share it. It reads only.
MCP callplex_read → list_collections
REST endpointGET https://cotlet.dev/api/v1/plex/collections
| Name | Type | Description |
|---|---|---|
| library string required | string | Library name as list_libraries returns it. |
{
"library": "library"
} {
"collections": [
{
"collection": "Desert Road Movies",
"items": 6
},
{
"collection": "Slow Cinema",
"items": 11
}
]
} Only the owner of a server can see and change who has access. Other accounts get APP_PERMISSION_DENIED.
Reads the Manage Library Access page: every account you shared your server with, the libraries it can use and whether an invite is still waiting. Only the server owner can open that page; other accounts get APP_PERMISSION_DENIED. It reads only.
MCP callplex_read → list_library_access
REST endpointGET https://cotlet.dev/api/v1/plex/library-access
No parameters.
{
"accounts": [
{
"name": "sam",
"status": "accepted",
"libraries": [
"Movies"
]
},
{
"name": "lena@example.com",
"status": "invited",
"libraries": [
"Movies",
"TV Shows"
]
}
]
} Runs the Grant Library Access wizard under Settings > Manage Library Access: you give the username or email, pick libraries and Plex sends the invite. Only the server owner can do this, and only for a server they own. Leave libraries out to share all of them. By default you confirm each call; you can switch that off for this tool.
MCP callplex_write → grant_library_access
REST endpointPOST https://cotlet.dev/api/v1/plex/library-access/grant
| Name | Type | Description |
|---|---|---|
| account string required | string | Plex username or email of the person to invite. |
| libraries array | array | Library names to share. Default: all libraries. |
{
"account": "sam@example.com",
"libraries": [
"Movies"
]
} {
"account": "sam@example.com",
"status": "invited",
"libraries": [
"Movies"
]
} Does what the X next to a name does on Manage Library Access: the account loses access to your libraries. Only the server owner can do this. The person can be invited again with grant_library_access. By default you confirm each call; you can switch that off for this tool.
MCP callplex_write → revoke_library_access
REST endpointPOST https://cotlet.dev/api/v1/plex/library-access/revoke
| Name | Type | Description |
|---|---|---|
| account string required | string | Username or email as list_library_access returns it. |
{
"account": "account"
} {
"account": "lena@example.com",
"status": "removed"
} Your signed-in Plex browser profile, AES-256-GCM encrypted, in Finland. No password.
The 14 Plex tools. Never the session cookie or your X-Plex-Token.
What your account sees in Plex Web: libraries, Watchlist, playlists, access list.
Plex Pass billing, password, two-factor, deleting media and playing video.
Your agent gets a link to sign in again. You type the password, we never do.
Disable for agents, reset the browser, or sign out your devices in Plex.
Our site scores A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory (live results). There is no SOC 2 report or third-party pentest yet.
When Plex moves a button or renames a field in Plex Web, the fix happens on our side and your prompts keep working. status.cotlet.dev checks the site, console and API every 3 minutes.
| Action | Undo |
|---|---|
| Add to Watchlist | remove_from_watchlist |
| Remove from Watchlist | add_to_watchlist |
| Mark watched | The same call with watched false; Plex can drop a watched title from your Watchlist |
| Add to a playlist | Remove the items in Plex |
| Grant library access | revoke_library_access; the invite Plex sent is out |
| Revoke library access | grant_library_access invites the person again |
2 of 14 tools ask first: grant_library_access and revoke_library_access, the two that change who can use your server. Watchlist, watched state and playlists are yours alone, so they run at once. Switch the wait off per tool for a scheduled run.
Library access is the owner's job: sign in as the owner of the server, or these two tools answer permission denied and cost nothing.
{
"name": "grant_library_access",
"arguments": {
"account": "sam@example.com",
"libraries": [
"Movies"
]
}
} curl -X POST https://cotlet.dev/api/v1/plex/library-access/grant \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"account":"sam@example.com","libraries":["Movies"]}' {
"account": "sam@example.com",
"status": "invited",
"libraries": [
"Movies"
]
} A script or a nightly job calls the same tools over REST at /api/v1/plex, with one key and one price, and no X-Plex-Token of your own. The tools table gives the REST path of each tool.
About $13 a monthfor one server owner with a weekly Watchlist routine, 2,230 credits. Your Plex plan is billed by Plex as before.
| Job | Calls | Credits |
|---|---|---|
| Check the Watchlist against libraries, weekly | 3 × 4 | 120 |
| Add 5 recommended titles to the Watchlist, weekly | 5 × 4 | 200 |
| Mark a finished series watched | 4 × 6 | 240 |
| Build a themed playlist | 3 × 3 | 90 |
| Review who can use the server, weekly | 1 × 4 | 40 |
| Invite a friend to chosen libraries | 2 × 2 | 40 |
| Cloud Browser, 30 days | 1,500 | |
| Total | 2,230 |
Plex publishes no figure for a typical account, so the month is our example: a home server with 3 libraries, a weekly Watchlist check and a few invites. Plex Pass is $6.99 a month or $69.99 a year, billed by Plex (6 Nov 2026). Dollars at the $29 pack rate.
| Credits | Price, one time | Calls at 10 credits | Per 1,000 credits |
|---|---|---|---|
| 5,000 | $29 | 500 | $5.80 |
| 15,000 | $79 | 1,500 | $5.27 |
| 32,000 | $149 | 3,200 | $4.66 |
| 60,000 | $249 | 6,000 | $4.15 |
Only successful calls use credits; failed calls and timeouts cost nothing. At a balance of 0 calls pause, never a surprise charge. Authenticate with the Authorization: Bearer header.
| Option | What it does | Where it stops |
|---|---|---|
| Plex Media Server API | Official REST on your server: libraries, search, playlists, collections, history, mark played. | Token and your own code. No Watchlist or sharing category in the docs. |
| Plex webhooks | Your server calls a URL when something plays or is added. | Plex Pass on the owner account. Events out only, nothing changes in Plex. |
| vladimir-tutin/plex-mcp-server | Python MCP server: libraries, media, collections, playlists, clients, users. 158 stars, MIT, last commit 13 Oct 2026. | You host it with your server address and token; Claude.ai and ChatGPT need it on public HTTPS. |
| niavasha/plex-mcp-server | 54 tools, 66 with writes on, plus Sonarr, Radarr and Trakt. 57 stars, MIT, last commit 2 Nov 2026. | You host it. Writes are opt-in; its README lists no library sharing. |
| dustinhansen/plex-mcp | Libraries, every household member's history, playlists, collections, ratings and the Watchlist. 0 stars, MIT, last commit 3 Nov 2026. | Local stdio on your computer, started 16 Oct 2026. |
| rollecode/plex-mcp | Lists 405 operations, including plex.tv sharing and the Watchlist. 0 stars, MIT, last commit 3 Oct 2026. | One person's project, started 15 Sep 2026; you host it. |
If you like running your own tools, a community server is free and covers the library side well. The Plex API suits a developer who wants full control of one server. When you want Plex inside ChatGPT or Claude, always on, with the Watchlist and library invites included and no token on your own computer, that is the part Cotlet covers.
Take Group sp. z o.o. builds and runs Cotlet. It is a software company registered in Poland, EU (VAT PL6342984273), operating since 2019 and founded by Bart Krawczyk (Co-founder, CTO) and Jake Slugocki (Co-founder, SEO, sales and marketing). Questions about the Plex tools go to contact@cotlet.dev.
Sign up at cotlet.dev, log in to Plex once in its Cloud Browser and add Cotlet to ChatGPT or Claude, following the steps in your console. No API key is needed. ChatGPT and Claude then work in your Plex account through Cotlet, in their phone apps too.
With Cotlet, ChatGPT, Claude and other AI agents handle jobs like these in Plex: check my Watchlist against my libraries; add recommended titles to the Watchlist; mark a finished series as watched. You ask in plain words, and anything that reaches other people waits for your OK first.
Sign up free at https://cotlet.dev, open Plex under Integrations in the console and sign in to Plex in its Cloud Browser. The trial starts with your first app, and no card is asked.
Yes, the way it must be when you open Plex Web away from home. Plex says Remote Access reaches your server from outside your local network, and that Relay is on by default as a fallback when the app cannot connect directly. The server also has to be online. The Watchlist works without a server.
No. The tools browse, search and manage; nothing plays video. Plex requires a Remote Watch Pass or Plex Pass, or an admin with Plex Pass, to stream personal video remotely since 29 Apr 2025. That rule is about playback, so it does not apply to these tools.
Only the server owner, and only for a server they own: Plex does not let you re-share a server shared with you. Restrictions on an invited account need a Plex Pass, and these tools do not set them.
Yes. Plex webhooks call a URL you set when your server sees an event, and Plex says they need an active Plex Pass on the server owner account. They only send events out. To change something in Plex from an agent, use the tools above.
Yes, for your Plex Media Server: developer.plex.tv/pms documents libraries, search, playlists, collections, playback history and marking items played. It needs an X-Plex-Token and your own code, and its docs list no Watchlist or library sharing category (checked 6 Nov 2026).
Only in how it is called. Both carry the same 14 tools, inputs and answers, with one API key and one price. Agents use MCP; scripts and HTTP steps use REST.
No. Cotlet is independent and not affiliated with Plex, Inc.
Free 7-day trial with 2,000 credits, no card needed.
May we use Google Analytics to see which pages help people? It sets cookies only if you accept. No ads, and we never sell data. Cookie policy