关于 Trakt
Trakt 是连接 Trakt.tv 的 MCP 服务,面向希望查询影视信息或管理个人观看记录的 AI 系统。它涵盖公共影视数据、账户记录、个性化推荐及评论。
主要功能
- 01查询热门、流行和预期影视内容
- 02查看影视、季节、剧集及演职员详情
- 03管理观看记录、评分和待看列表
- 04获取观看进度与个性化推荐
- 05浏览评论、影评及评分分布
- 06支持分页和实时趋势数据
适用场景
- 01查找热门剧集或电影
- 02查看某剧集的季节、演员和评分信息
- 03更新个人观看记录或待看列表
- 04依据观看历史获取影视推荐
MCP 相关
该 MCP 服务通过工具和资源向 MCP 客户端提供 Trakt.tv 的公共及个人影视数据,可查询和管理观看记录、评分、待看列表等。个人数据操作需要通过设备码流程进行 Trakt 身份验证。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
🎬 MCP Trakt:AI 通往娱乐数据的入口
一个 Model Context Protocol(MCP)服务,在 AI 大模型与 Trakt.tv API 之间搭建桥梁,让大模型能够访问实时娱乐数据和个人 Trakt 观看历史。该服务采用基于领域的架构,使用 FastMCP 在身份验证、剧集、季、集、电影、人物、用户数据、评论、搜索和签到功能之间实现清晰的职责分离。
🖥️ 一项 AI 实验
除本段文字外,这里的所有内容都是由 AI 生成的,包括代码。我希望进一步了解 MCP,也一直在用 Cursor 进行各种尝试,因此将两者结合起来似乎是自然而然的下一步。这个项目便由此诞生。今后的所有更改也将由 AI 完成。
📚 关于 MCP 和 Trakt
Model Context Protocol(MCP) 让 AI 模型能够通过标准化的工具和资源与外部系统交互。Trakt.tv 是一个综合性平台,可用于追踪电视剧和电影,拥有超过 1,400 万用户,并为开发者提供丰富的 API。
🚀 快速开始
创建 Trakt API 应用
你需要拥有自己的 Trakt API 应用,才能获取 Client ID:
- 前往 developer.trakt.tv 并创建应用。Trakt 要求使用已验证的 GitHub 账户。
- 应用类型:个人使用请选择 Development。只有你和你添加的人可以登录。
- 重定向 URI:输入
http://localhost。服务使用设备代码流程登录,不会接收回调,但 Trakt 要求应用至少设置一个 URI。 - 允许的来源:留空即可。它们仅适用于在 Web 浏览器中运行的代码。
- 将 Client ID 复制到
TRAKT_CLIENT_ID。如果 Trakt 为你的应用签发了 Client Secret(较早创建的应用可能有),请将其设置为TRAKT_CLIENT_SECRET。新应用不会获得 Client Secret,因此无需设置。
Docker 快速入门
docker run -d --rm --name trakt_mcpserver \
-e TRAKT_CLIENT_ID=your_client_id \
-v trakt_auth:/data \
-p 8080:8080 \
ghcr.io/wwiens/trakt_mcpserver:latest
使用 uvx 运行(无需克隆或安装)
需要安装 uv。
已安装的软件包只会从环境变量读取凭据。它不会加载 .env 文件,因此请在 Shell 或 MCP 客户端的 env 块中设置 TRAKT_CLIENT_ID(见下文)。
TRAKT_CLIENT_ID=your_client_id uvx trakt-mcp
为确保可复现,请固定到某个发行版本:
TRAKT_CLIENT_ID=your_client_id uvx [email protected]
Claude Desktop / MCPhub 配置:
{
"mcpServers": {
"trakt": {
"command": "uvx",
"args": ["trakt-mcp"],
"env": {
"TRAKT_CLIENT_ID": "your_client_id"
}
}
}
}
你的 Trakt OAuth 令牌会保存在 ~/.trakt-mcp/auth_token.json 中(首次登录时会创建该目录),因此授权状态会在多次调用 uvx 时保留。如需更改保存位置(例如用于 Docker 卷,或保留多个隔离账户),请将 TRAKT_AUTH_TOKEN_PATH 设置为绝对路径。
使用 pip 安装
需要 Python 3.12 或更高版本。与 uvx 一样,凭据从环境变量读取,而非 .env 文件。
pip install trakt-mcp
TRAKT_CLIENT_ID=your_client_id trakt-mcp
本地安装
需要 Python 3.12 或更高版本。
-
克隆此代码库
git clone https://github.com/wwiens/trakt_mcpserver.git cd trakt_mcpserver -
创建虚拟环境并安装依赖项
python3 -m venv .venv source .venv/bin/activate pip install -e . -
设置环境
cp .env.example .env然后编辑
.env,添加你的 Trakt API 凭据:TRAKT_CLIENT_ID=your_client_id -
运行服务
python server.py
在 Claude Desktop 中安装
将以下内容添加到 Claude Desktop MCP 配置文件中:
{
"mcpServers": {
"trakt": {
"command": "python",
"args": ["/path/to/your/server.py"],
"env": {
"TRAKT_CLIENT_ID": "your_client_id"
}
}
}
}
✨ 功能
🌎 Trakt 公开数据
- 获取热门趋势和人气影视剧
- 发现最受期待、最受喜爱、播放次数最多和观看次数最多的内容
- 查看上周末美国票房最高的电影
- 获取 Trakt 全球社区的实时数据
- 获取包含标题、年份和人气指标的格式化响应
- 查看详细评分,了解影视剧的平均分和评分分布
- 浏览剧集季,查看每季的剧集数量、已播出剧集和评分
- 深入了解具体季,查看详细信息、剧集列表、评分、演职人员、视频、翻译和互动统计
- 查看当前正在观看特定季的用户
- 查找包含特定季的列表
- 探索单集详情,查看详细简介、评分、演职人员、视频、翻译和互动统计
- 查看当前正在观看特定剧集的用户
- 查找包含特定剧集的列表
- 查询任意电影或影视剧的演职人员,并可选择查看影视剧的客串演员
- 探索人物信息,查看传记、社交媒体和完整作品目录
- 浏览人物的作品记录,查看其参与的电影和影视剧、角色名称和剧集数量
- 查找包含特定人物的列表
👤 Trakt 个人数据
- 查看你已观看的影视剧:获取你亲自看过的所有影视剧的完整列表
- 查看每部剧集最近一次观看的准确日期
- 追踪每部影视剧的观看次数
- 签到观看中的影视剧,将其标记为已观看
- 可使用影视剧 ID(更精确)或标题(更方便)
- 签到时可附加自定义消息
- 以易读格式查看观看剧集的时间
- 搜索影视剧,查找详情和 ID
- 管理评分:查看、添加和删除电影、影视剧、季和剧集的个人评分,并支持分页
- 管理待看列表:查看、添加和删除待看列表中的项目,并支持分页和排序
- 按类型筛选(全部、电影、影视剧、季、剧集)
- 按多种条件排序(排名、添加时间、标题、上映时间、时长、人气、百分比、投票数)
- 为待看列表中的项目添加可选备注(VIP 功能,最多 500 个字符)
- 追踪影视剧进度:查看任意电视剧的观看进度
- 查看已观看与已播出的剧集数量及完成百分比
- 查看下一集待看内容
- 查看各季的进度明细
- 可选是否包含隐藏的季和特别篇
- 管理播放进度:查看和清除暂停的播放项目
- 查看暂停观看的电影和剧集
- 查看播放进度百分比及暂停时间
- 清除不再需要的播放项目
- 管理观看记录:在观看记录中添加和删除项目
- 将电影、影视剧、季或剧集标记为已观看
- 可选指定观看时间
- 从观看记录中删除项目
- 通过设备代码流程安全地向 Trakt 验证身份
- 直接从你的 Trakt 账户获取个人数据
🎯 个性化推荐
- 根据你的观看记录和评分获取定制的电影和影视剧推荐(需要身份验证)
- 筛除你已收藏或已添加到待看列表的项目
- 隐藏你不感兴趣的推荐,避免它们再次出现
- 取消隐藏之前隐藏的项目,以恢复显示
💬 评论与评价
- 查看剧集和电影的评论:阅读其他人对你喜爱的内容的看法
- 查看特定季和剧集的评论:了解剧集特定部分的见解
- 查看单条评论及其回复:参与社区讨论
- 剧透保护:默认隐藏含有剧透的评论
- 切换剧透显示:选择显示或隐藏剧透
- 查看评价:较长、更详细的评论会标记为评价
- 查看评分分布:了解有多少用户给出了 1-10 分的各个评分
🔄 常规功能
- 通过 MCP 资源公开 Trakt API 数据
- 提供用于获取实时娱乐信息的工具
- 支持 AI 模型提供个性化娱乐推荐
- 简单的身份验证和注销流程
- 列表端点支持分页(trending、popular、anticipated、favorited、played、watched、search、comments、ratings、watchlist):
- 传入
page: int,获取单页结果及分页元数据 - 不传入
page,自动分页并以平铺列表形式返回最多limit个条目 - 使用
limit=0获取所有可用结果(为安全起见,最多返回 100 条)
- 传入
🔥 实时趋势数据
- 查看当前热门剧集及实时观看人数
- 获取实时更新的热门电影
- 查看 Trakt 全球 1,400 多万用户中受欢迎的内容
- 示例:The White Lotus (2021)、Daredevil: Born Again (2025)、Black Bag (2025)
🔌 可用资源
MCP 资源提供 AI 模型可访问的静态数据端点。这些 URI 通过标准化接口公开 Trakt 数据。
查看所有可用资源
剧集资源
| 资源 | 描述 | 示例数据 |
|---|---|---|
trakt://shows/trending | 过去 24 小时内观看次数最多的剧集 | 剧集名称、年份、观看人数 |
trakt://shows/popular | 根据评分选出的最受欢迎剧集 | 剧集名称、年份、热门评分 |
trakt://shows/anticipated | 按加入列表次数排序的最受期待剧集 | 剧集名称、年份、加入列表次数 |
trakt://shows/favorited | 最受喜爱的剧集 | 剧集名称、年份、收藏数 |
trakt://shows/played | 播放次数最多的剧集 | 剧集名称、年份、播放次数 |
trakt://shows/watched | 独立用户观看次数最多的剧集 | 剧集名称、年份、观看人数 |
电影资源
| 资源 | 描述 | 示例数据 |
|---|---|---|
trakt://movies/trending | 过去 24 小时内观看次数最多的电影 | 电影名称、年份、观看人数 |
trakt://movies/popular | 根据评分选出的最受欢迎电影 | 电影名称、年份、热门评分 |
trakt://movies/anticipated | 按加入列表次数排序的最受期待电影 | 电影名称、年份、加入列表次数 |
trakt://movies/favorited | 最受喜爱的电影 | 电影名称、年份、收藏数 |
trakt://movies/played | 播放次数最多的电影 | 电影名称、年份、播放次数 |
trakt://movies/watched | 独立用户观看次数最多的电影 | 电影名称、年份、观看人数 |
trakt://movies/boxoffice | 上周末美国票房收入最高的 10 部电影 | 电影名称、年份、收入 |
用户资源
| 资源 | 描述 | 示例数据 |
|---|---|---|
trakt://user/auth/status | 当前身份验证状态 | 身份验证状态、令牌到期时间 |
trakt://user/watched/shows | 已通过身份验证的用户观看过的剧集 | 剧集名称、年份、上次观看日期、播放次数 |
trakt://user/watched/movies | 已通过身份验证的用户观看过的电影 | 电影名称、年份、上次观看日期、播放次数 |
MCP 工具是 AI 模型可以通过参数调用的交互式函数。使用这些工具来获取、搜索和管理 Trakt 数据。
显示工具
# Get trending shows: auto-paginate up to 10 results
fetch_trending_shows(limit=10)
# Get trending shows: fetch ALL results (no limit)
fetch_trending_shows(limit=0)
# Get trending shows: single page with pagination metadata
fetch_trending_shows(limit=10, page=1)
# Get popular shows with optional limit parameter
fetch_popular_shows(limit=10)
# Get anticipated shows with optional limit parameter
fetch_anticipated_shows(limit=10)
# Get favorited shows with optional limit and period parameters
fetch_favorited_shows(limit=10, period="weekly")
# Get most played shows with optional limit and period parameters
fetch_played_shows(limit=10, period="weekly")
# Get most watched shows with optional limit and period parameters
fetch_watched_shows(limit=10, period="weekly")
# Search for shows: auto-paginate all results (omit page parameter)
search_shows(query="Breaking Bad", limit=5)
# Search for shows: single page with pagination metadata
search_shows(query="Breaking Bad", limit=5, page=1)
# Get ratings for a show
fetch_show_ratings(show_id="game-of-thrones")
# Get comprehensive show summary (includes air times, production status, ratings, metadata)
fetch_show_summary(show_id="game-of-thrones", extended=True) # Default: comprehensive
# Get basic show summary (title, year, ID only)
fetch_show_summary(show_id="game-of-thrones", extended=False)
# Get videos for a show (with embedded markdown - default)
fetch_show_videos(show_id="game-of-thrones")
# Get videos for a show (simple text links)
fetch_show_videos(show_id="game-of-thrones", embed_markdown=False)
# Get related shows (similar shows based on genres, themes, and viewer patterns)
fetch_related_shows(show_id="game-of-thrones", limit=10)
# Get related shows with pagination metadata
fetch_related_shows(show_id="game-of-thrones", limit=10, page=1)
# Get all seasons for a show (includes episode counts, aired episodes, ratings)
fetch_show_seasons(show_id="game-of-thrones")
# Get cast and crew for a show
fetch_show_people(show_id="breaking-bad")
# Get cast, crew, and guest stars for a show
fetch_show_people(show_id="breaking-bad", include_guest_stars=True)
# Search for movies: auto-paginate all results (omit page parameter)
search_movies(query="The Godfather", limit=5)
# Search for movies: single page with pagination metadata
search_movies(query="The Godfather", limit=5, page=1)
季工具
# Get detailed info about a specific season
fetch_season_info(show_id="breaking-bad", season=1)
# Get all episodes for a season with ratings and runtime
fetch_season_episodes(show_id="breaking-bad", season=1)
# Get ratings and voting distribution for a season
fetch_season_ratings(show_id="breaking-bad", season=1)
# Get engagement stats (watchers, plays, collectors)
fetch_season_stats(show_id="breaking-bad", season=1)
# Get cast and crew for a season
fetch_season_people(show_id="breaking-bad", season=1)
# Get videos/trailers for a season (with embedded markdown - default)
fetch_season_videos(show_id="breaking-bad", season=1)
# Get videos for a season (simple text links)
fetch_season_videos(show_id="breaking-bad", season=1, embed_markdown=False)
# See who's watching a season right now
fetch_season_watching(show_id="breaking-bad", season=1)
# Get translations for a season (all languages)
fetch_season_translations(show_id="breaking-bad", season=1)
# Get translations for a specific language
fetch_season_translations(show_id="breaking-bad", season=1, language="es")
# Get lists containing a season
fetch_season_lists(show_id="breaking-bad", season=1)
# Get lists with type and sort filters
fetch_season_lists(show_id="breaking-bad", season=1, list_type="personal", sort="popular")
剧集工具
# Get detailed info about a specific episode
fetch_episode_summary(show_id="breaking-bad", season=1, episode=1)
# Get ratings and voting distribution for an episode
fetch_episode_ratings(show_id="breaking-bad", season=1, episode=1)
# Get engagement stats (watchers, plays, collectors)
fetch_episode_stats(show_id="breaking-bad", season=1, episode=1)
# Get cast and crew for an episode
fetch_episode_people(show_id="breaking-bad", season=1, episode=1)
# Get videos/trailers for an episode (with embedded markdown - default)
fetch_episode_videos(show_id="breaking-bad", season=1, episode=1)
# Get videos for an episode (simple text links)
fetch_episode_videos(show_id="breaking-bad", season=1, episode=1, embed_markdown=False)
# See who's watching an episode right now
fetch_episode_watching(show_id="breaking-bad", season=1, episode=1)
# Get translations for an episode (all languages)
fetch_episode_translations(show_id="breaking-bad", season=1, episode=1)
# Get translations for a specific language
fetch_episode_translations(show_id="breaking-bad", season=1, episode=1, language="es")
# Get lists containing an episode
fetch_episode_lists(show_id="breaking-bad", season=1, episode=1)
# Get lists with type and sort filters
fetch_episode_lists(show_id="breaking-bad", season=1, episode=1, list_type="personal", sort="popular")
电影工具
# Get trending movies: auto-paginate all results (omit page parameter)
fetch_trending_movies(limit=10)
# Get trending movies: single page with pagination metadata
fetch_trending_movies(limit=10, page=1)
# Get popular movies with optional limit parameter
fetch_popular_movies(limit=10)
# Get anticipated movies with optional limit parameter
fetch_anticipated_movies(limit=10)
# Get favorited movies with optional limit and period parameters
fetch_favorited_movies(limit=10, period="weekly")
# Get most played movies with optional limit and period parameters
fetch_played_movies(limit=10, period="weekly")
# Get most watched movies with optional limit and period parameters
fetch_watched_movies(limit=10, period="weekly")
# Get the top 10 U.S. box office movies from last weekend
fetch_boxoffice_movies()
# Get ratings for a movie
fetch_movie_ratings(movie_id="tron-legacy-2010")
# Get comprehensive movie summary (includes production status, ratings, genres, runtime, certification, metadata)
fetch_movie_summary(movie_id="tron-legacy-2010", extended=True) # Default: comprehensive
# Get basic movie summary (title, year, ID only)
fetch_movie_summary(movie_id="tron-legacy-2010", extended=False)
# Get videos for a movie (with embedded markdown - default)
fetch_movie_videos(movie_id="tron-legacy-2010")
# Get videos for a movie (simple text links)
fetch_movie_videos(movie_id="tron-legacy-2010", embed_markdown=False)
# Get related movies (similar movies based on genres, themes, and viewer patterns)
fetch_related_movies(movie_id="tron-legacy-2010", limit=10)
# Get related movies with pagination metadata
fetch_related_movies(movie_id="tron-legacy-2010", limit=10, page=1)
# Get cast and crew for a movie
fetch_movie_people(movie_id="the-dark-knight-2008")
人物工具
# Get extended person details (biography, social media, birthday)
fetch_person_summary(person_id="bryan-cranston")
# Get basic person details (name and IDs only)
fetch_person_summary(person_id="bryan-cranston", extended=False)
# Look up by IMDB ID
fetch_person_summary(person_id="nm0186505")
# Get all movie credits for a person (cast roles and crew positions)
fetch_person_movies(person_id="bryan-cranston")
# Get all show credits for a person (with episode counts and series regular flags)
fetch_person_shows(person_id="bryan-cranston")
# Get lists containing a person (all types, sorted by popularity)
fetch_person_lists(person_id="bryan-cranston")
# Get lists with type and sort filters
fetch_person_lists(person_id="bryan-cranston", list_type="personal", sort="likes")
身份验证和用户工具
# Start the device authorization flow with Trakt
start_device_auth()
# Check the status of an ongoing authentication
check_auth_status()
# Clear authentication (logout)
clear_auth()
# Fetch shows watched by the authenticated user
fetch_user_watched_shows(limit=0) # 0 for all shows
# Fetch movies watched by the authenticated user
fetch_user_watched_movies(limit=0) # 0 for all movies
# Fetch user's personal ratings with pagination support
fetch_user_ratings(rating_type="movies", rating=10, page=1)
# Add new ratings for movies, shows, seasons, or episodes
add_user_ratings(rating_type="movies", items=[{"trakt_id": "314", "rating": 9}])
# Remove existing ratings by ID
remove_user_ratings(rating_type="movies", items=[{"trakt_id": "314"}])
# Fetch user's watchlist with pagination and sorting
fetch_user_watchlist(watchlist_type="all", sort_by="rank", sort_how="asc", page=1)
# Add items to watchlist with optional notes (VIP)
add_user_watchlist(watchlist_type="movies", items=[{"trakt_id": "314", "notes": "Must watch!"}])
# Remove items from watchlist
remove_user_watchlist(watchlist_type="movies", items=[{"trakt_id": "314"}])
签到工具
# Method 1: Check in using show ID (recommended when precision is important)
# First use search_shows to find the correct show ID
search_shows(query="Breaking Bad", limit=5)
# Then use the ID for check-in
checkin_to_show(
season=1,
episode=3,
show_id="1388",
message="Loving this show!"
)
# Method 2: Check in using show title (more convenient)
checkin_to_show(
season=1,
episode=1,
show_title="Breaking Bad",
show_year=2008, # Optional but helps with accuracy
message="I'm the one who knocks!"
)
评论工具
# Get comments for a movie: auto-paginate all results (omit page parameter)
fetch_movie_comments(movie_id="123", limit=10, show_spoilers=False)
# Get comments for a movie: single page with pagination metadata
fetch_movie_comments(movie_id="123", limit=10, show_spoilers=False, page=1)
# Get comments for a show: auto-paginate all results (omit page parameter)
fetch_show_comments(show_id="456", limit=10, show_spoilers=False, sort="likes")
# Get comments for a show: single page with pagination metadata
fetch_show_comments(show_id="456", limit=10, show_spoilers=False, sort="likes", page=1)
# Get comments for a specific season sorted by most liked
fetch_season_comments(show_id="456", season=1, limit=10, show_spoilers=False, sort="likes")
# Get comments for a specific episode sorted by most replies
fetch_episode_comments(show_id="456", season=1, episode=3, limit=10, show_spoilers=False, sort="replies")
# Get a specific comment
fetch_comment(comment_id="789", show_spoilers=False)
# Get a comment with its replies
fetch_comment_replies(comment_id="789", limit=10, show_spoilers=False)
推荐工具
# Get personalized movie recommendations (requires authentication)
fetch_movie_recommendations(limit=10)
# Include movies you've already collected or watchlisted
fetch_movie_recommendations(limit=10, ignore_collected=False, ignore_watchlisted=False)
# Get personalized show recommendations
fetch_show_recommendations(limit=10)
# Hide a movie from future recommendations
hide_movie_recommendation(movie_id="tron-legacy-2010")
# Hide a show from future recommendations
hide_show_recommendation(show_id="breaking-bad")
# Unhide a previously-hidden movie
unhide_movie_recommendation(movie_id="tron-legacy-2010")
# Unhide a previously-hidden show
unhide_show_recommendation(show_id="breaking-bad")
进度工具
# Get watched progress for a TV show
fetch_show_progress(show_id="breaking-bad")
# Get show progress with specials and hidden seasons included
fetch_show_progress(
show_id="game-of-thrones",
hidden=True, # Include hidden seasons
specials=True, # Include season 0 (specials)
count_specials=True, # Count specials in overall stats
last_activity="watched" # Calculate next episode based on watched order
)
# Get detailed episode-by-episode progress with watch dates
fetch_show_progress(show_id="breaking-bad", verbose=True)
# Get paused playback progress (all types)
fetch_playback_progress()
# Get paused playback progress (movies only)
fetch_playback_progress(playback_type="movies")
# Get paused playback progress (episodes only)
fetch_playback_progress(playback_type="episodes")
# Remove a paused playback item (get ID from fetch_playback_progress)
remove_playback_item(playback_id=12345)
# Check if a movie has been watched (returns watch dates and count)
fetch_history(history_type="movies", item_id="314") # The Dark Knight
# Check watch history for a show
fetch_history(history_type="shows", item_id="1388") # Breaking Bad
# Browse all movie watch history
fetch_history(history_type="movies")
# Browse all watch history (all types)
fetch_history()
# Filter history by date range
fetch_history(
history_type="movies",
start_at="2024-01-01T00:00:00.000Z",
end_at="2024-12-31T23:59:59.000Z"
)
# Add movies to watch history
add_to_history(
history_type="movies",
items=[{"trakt_id": "314"}] # The Dark Knight
)
# Add movies with custom watched date
add_to_history(
history_type="movies",
items=[{"trakt_id": "314", "watched_at": "2024-01-15T20:30:00.000Z"}]
)
# Add movies watched on an unknown date
add_to_history(
history_type="movies",
items=[{"trakt_id": "314", "watched_at": "unknown"}]
)
# Add episodes to watch history
add_to_history(
history_type="episodes",
items=[{"trakt_id": "62085"}] # Breaking Bad S01E01
)
# Add episodes at their release date + runtime (not supported for movies)
add_to_history(
history_type="episodes",
items=[{"trakt_id": "62085", "watched_at": "released"}]
)
# Remove movies from watch history
remove_from_history(
history_type="movies",
items=[{"trakt_id": "314"}]
)
# Remove episodes from watch history
remove_from_history(
history_type="episodes",
items=[{"trakt_id": "62085"}]
)
📝 与 Claude 搭配使用
安装后,Claude 可以使用此 MCP 服务回答有关娱乐数据的问题。以下是一些示例,供你入门。
- “目前哪些剧集正在流行?”
- “显示我看过的剧集”(需要身份验证)
- “《权力的游戏》的评分是多少?”
查看更多问题示例
**公开数据(无需身份验证):** - “目前最受期待的剧集有哪些?” - “给我看看最受期待的即将上映电影” - “本周末有哪些电影正在热映?” - “给我看看目前票房最高的电影” - “能给我推荐一些本周热门电影吗?” - “本月观看次数最多的剧集有哪些?” - “搜索类似《绝命毒师》的剧集” - “搜索类似《教父》的电影” - “给我看看《绝命毒师》的评论” - “大家对电影《教父》有什么看法?” - “给我看看《怪奇物语》第一季的评论” - “获取《权力的游戏》第二季第五集的评论” - “给我看看编号为 12345 的评论及其回复” - “给我看看《绝命毒师》的评论,但包含剧透” - “给我看看《绝命毒师》获赞最多的评论” - “获取电影《教父》获赞最多的评论” - “给我看看《怪奇物语》第一季回复最多的评论” - “给我看看《教父》的评分分布” - “《绝命毒师》的评分有多高?” - “给我看看《创:战纪》的预告片” - “获取《权力的游戏》的视频” - “《教父》有哪些预告片?” - “获取《绝命毒师》的详细简介” - “给我看看电影《教父》的详细信息” - “给我看看《权力的游戏》的基本信息” - “给我看看类似《绝命毒师》的剧集” - “有哪些电影与《创:战纪》相关?” - “查找类似《权力的游戏》的剧集” - “介绍一下《绝命毒师》第一季” - “《权力的游戏》第二季有哪些剧集?” - “《绝命毒师》第五季的评分如何?” - “《权力的游戏》第一季有哪些主演?” - “《绝命毒师》第一季有多受欢迎?” - “《怪奇物语》第二季有预告片吗?” - “现在有哪些人在看《绝命毒师》第一季?” - “获取《绝命毒师》第一季的西班牙语译文” - “哪些列表中包含《绝命毒师》第一季?” - “介绍一下《绝命毒师》的试播集” - “《权力的游戏》第一季第一集的评分如何?” - “《绝命毒师》第一集有哪些主演?” - “《绝命毒师》第五季第十六集有多受欢迎?” - “《怪奇物语》第一季第一集有预告片吗?” - “现在有哪些人在看《绝命毒师》第一季第一集?” - “获取《绝命毒师》第一季第一集的西班牙语译文” - “哪些列表中包含《绝命毒师》第一季第一集?” - “谁出演了《蝙蝠侠:黑暗骑士》?” - “给我看看《绝命毒师》的演员和剧组人员” - “给我看看《绝命毒师》的客串明星” - “介绍一下布莱恩·克兰斯顿” - “布莱恩·克兰斯顿出演过哪些电影?” - “布莱恩·克兰斯顿参演过哪些电视剧?” - “哪些列表收录了布莱恩·克兰斯顿?”个人数据(需要身份验证):
- “我最近看过的剧集是什么?”
- “给我看看我看过的电影”
- “我最近看过的电影是什么?”
- “我看过《蝙蝠侠:黑暗骑士》吗?”
- “我看过《盗梦空间》吗?”
- “我什么时候看过《黑客帝国》?”
- “给我看看我评为 10/10 的电影”
- “给《绝命毒师》打 9/10 分”
- “给我看看我的待看列表”
- “我的待看列表里有哪些电影?”
- “将《教父》添加到我的待看列表”
- “将《绝命毒师》添加到我的待看列表并附上备注”(VIP)
- “从我的待看列表中移除《蝙蝠侠:黑暗骑士》”
- “给我看看按添加时间排序的待看列表”
- “将我的观看状态更新为《绝命毒师》第二季第五集”
- “将我的观看状态更新为 ID 为 1388 的剧集第一季第三集”
- “我看《绝命毒师》看到哪里了?”
- “我看《权力的游戏》看到哪里了?”
- “《怪奇物语》的下一集该看哪一集?”
- “给我看看暂停播放的电影或剧集”
- “清除那部电影的暂停播放记录”
- “将《蝙蝠侠:黑暗骑士》标记为已观看”
- “将《绝命毒师》第一季添加到我的观看历史记录”
- “从我的观看历史记录中移除《盗梦空间》”
通过身份验证,你可以访问:
- 你完整的已观看剧集和电影记录
- 每部剧集和电影的最近观看日期
- 你观看每部剧集和电影的次数
- 对正在观看的剧集签到并跟踪进度
- 个人观看统计信息
- 你完整的待看清单,并支持筛选和排序
- 在待看清单中添加和移除条目
- 为待看清单条目添加个人备注(VIP 功能)
- 剧集进度跟踪:查看你看完任何电视剧的进度,以及下一集推荐
- 播放进度:查看并清除你暂停观看的电影或剧集
- 观看记录管理:在观看记录中添加或移除条目,并可选择时间戳
所有数据都会实时直接从你的 Trakt 账户获取。
🔐 身份验证
该服务使用 Trakt 的设备身份验证流程:
- 当你请求用户专属数据时,如有需要,服务会自动启动身份验证
- 你会收到一个代码和一个需要在浏览器中访问的网址
- 在 Trakt 网站输入代码并授权应用后,告知 Claude 你已完成授权
- Claude 会检查身份验证状态,然后获取你的个人数据
- 你的身份验证令牌会安全地存储在
~/.trakt-mcp/auth_token.json中,权限为0o600。使用环境变量TRAKT_AUTH_TOKEN_PATH覆盖存储位置;Docker 镜像会将其设为/data/auth_token.json——在/data挂载卷(例如-v trakt_auth:/data),以便在重新创建容器后保留身份验证信息。
你可以随时使用 clear_auth 工具注销。
| 变量 | 必填 | 说明 |
|---|---|---|
TRAKT_CLIENT_ID | 是 | 你的 Trakt API 应用的客户端 ID |
TRAKT_CLIENT_SECRET | 否 | 客户端密钥(如果你的应用有)。Trakt 已不再要求用户登录时提供此密钥 |
TRAKT_REDIRECT_URI | 否 | 服务刷新令牌时发送的地址。必须是 HTTPS 或环回 HTTP。默认值为 http://localhost |
TRAKT_AUTH_TOKEN_PATH | 否 | OAuth 令牌的存储位置。默认值为 ~/.trakt-mcp/auth_token.json |
访问令牌有效期为 7 天,并会自动刷新。刷新令牌只能使用一次。如果刷新时出现 invalid_grant / session not found 错误(例如,令牌是在 Trakt 身份验证迁移之前签发的),请重新运行一次设备流程。
🐳 Docker 部署
提供了两种使用不同传输机制的 Docker 镜像。每个版本也会发布带版本号的标签(例如 :0.9.0、:0.9.0-stdio),以便固定版本。
| 镜像标签 | 传输方式 | 用途 |
|---|---|---|
:latest | SSE(HTTP) | 远程访问、Web 客户端、docker-compose |
:latest-stdio | stdio | MCPhub、Claude Desktop、本地 MCP 客户端 |
:stdio | stdio | 已弃用的 :latest-stdio 别名——将在 v1.0.0 移除 |
stdio 传输(MCPhub、Claude Desktop)
对于通过标准输入/标准输出通信的 MCP 客户端,请使用 :latest-stdio 镜像(或固定到 :0.9.0-stdio 等版本):
# Pull and run the stdio image
docker run -i --rm --name trakt_mcpserver_stdio \
-e TRAKT_CLIENT_ID=your_client_id \
-v trakt_auth:/data \
ghcr.io/wwiens/trakt_mcpserver:latest-stdio
Claude Desktop 配置:
{
"mcpServers": {
"trakt": {
"command": "docker",
"args": [
"run", "-i", "--rm", "--name", "trakt_mcpserver_stdio",
"-e", "TRAKT_CLIENT_ID=your_client_id",
"-v", "trakt_auth:/data",
"ghcr.io/wwiens/trakt_mcpserver:latest-stdio"
]
}
}
}
SSE 传输(HTTP/远程)
使用 :latest 镜像进行基于 HTTP 的访问:
# Option 1: Pull and run from GHCR (recommended)
docker run -d --rm --name trakt_mcpserver \
-e TRAKT_CLIENT_ID=your_client_id \
-v trakt_auth:/data \
-p 8080:8080 \
ghcr.io/wwiens/trakt_mcpserver:latest
# Option 2: Build locally and run
docker build -t trakt_mcpserver .
docker run -d --rm --name trakt_mcpserver \
-e TRAKT_CLIENT_ID=your_client_id \
-v trakt_auth:/data \
-p 8080:8080 \
trakt_mcpserver
使用 docker compose
docker-compose.yml 会从仓库根目录下的 .env 读取凭据,因此请先创建该文件:
cp .env.example .env # then set TRAKT_CLIENT_ID in .env
# Builds the docker image using the default Dockerfile (SSE variant) and starts the service
docker compose up
这会在 http://localhost:8080 上运行服务,并通过 SSE(HTTP 传输)代理 MCP 请求。
🧪 开发与测试
对于使用或扩展此 MCP 服务的开发者,以下是测试工具和开发工作流。
🚀 AI 辅助开发体验
本项目使用 AI 辅助开发工具构建:
- Cursor - 用于快速开发的 AI 代码编辑器
- Aider - 用于代码协作的 AI 结对编程工具
- Claude Code - Claude 专用的编码界面
使用 MCP Inspector 进行测试
验证 MCP 服务的实现,并探索可用的工具、资源和提示词。
查看 MCP Inspector 命令
# List available tools
npx @modelcontextprotocol/inspector --cli python server.py --method tools/list
# List available resources
npx @modelcontextprotocol/inspector --cli python server.py --method resources/list
# List available prompts
npx @modelcontextprotocol/inspector --cli python server.py --method prompts/list
运行测试
在进行更改前,使用 pytest、类型检查和代码检查确保代码质量。
查看测试命令
# Create a virtual environment, then install the project (editable) and test dependencies
python3 -m venv .venv
source .venv/bin/activate
pip install -e .
pip install -r requirements-dev.txt
# Run all tests
pytest
# Run with verbose output
pytest -v -s
# Type checking
pyright
# Code linting and formatting with ruff
ruff check --fix # Auto-fix issues
ruff format # Format code
📄 许可证
由 🧠 AI 与人类协作打造
由 Claude 提供支持
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。