一个模型上下文协议(MCP)服务器,它在AI语言模型与Trakt.tv API之间建立桥梁,允许大型语言模型访问实时娱乐数据和个人Trakt观看历史。使用FastMCP构建了一个领域聚焦架构,实现了身份验证、节目、电影、用户数据、评论、搜索和签到功能之间的清晰分离。
除了这一段落外,所有内容都是由AI生成的,包括代码。我的目标是更多地了解MCP,并且一直在玩Cursor,所以将这些结合起来似乎是自然而然的下一步。结果就是这个项目。未来的所有更改也将由AI完成。
模型上下文协议(MCP)使AI模型能够通过标准化工具和资源与外部系统交互。Trakt.tv是一个拥有超过1400万用户的全面平台,用于跟踪电视节目和电影,并为开发者提供了广泛的API。
docker run -d --rm --name trakt_server \
-e TRAKT_CLIENT_ID=your_client_id \
-e TRAKT_CLIENT_SECRET=your_client_secret \
-p 8080:8080 \
ghcr.io/wwiens/trakt_mcpserver:latest
克隆此仓库
git clone https://github.com/yourusername/mcp-trakt.git
cd mcp-trakt
安装依赖项
pip install -r requirements.txt
设置环境
cp .env.example .env
然后编辑.env文件以添加您的Trakt API凭证:
TRAKT_CLIENT_ID=your_client_id
TRAKT_CLIENT_SECRET=your_client_secret
运行服务器
python server.py
在您的Claude Desktop MCP配置文件中添加以下内容:
{
"mcpServers": {
"trakt": {
"command": "python",
"args": ["/path/to/your/server.py"],
"env": {
"TRAKT_CLIENT_ID": "your_client_id",
"TRAKT_CLIENT_SECRET": "your_client_secret"
}
}
}
}
page: int以获取单页结果及元数据(分页响应),或省略page以自动获取所有结果作为扁平列表MCP资源提供AI模型可以访问的静态数据端点。这些URI通过标准化接口暴露Trakt数据。
<details> <summary><strong>查看所有可用资源</strong></summary>| 资源 | 描述 | 示例数据 |
|---|---|---|
trakt://shows/trending | 最近24小时内观看次数最多的节目 | 节目标题、年份、观看者数量 |
trakt://shows/popular | 基于评分的最受欢迎节目 | 节目标题、年份、受欢迎评分 |
trakt://shows/favorited | 收藏次数最多的节目 | 节目标题、年份、收藏次数 |
trakt://shows/played | 播放次数最多的节目 | 节目标题、年份、播放次数 |
trakt://shows/watched | 独立用户观看次数最多的节目 | 节目标题、年份、观看者数量 |
| 资源 | 描述 | 示例数据 |
|---|---|---|
trakt://movies/trending | 最近24小时内观看次数最多的电影 | 电影标题、年份、观看者数量 |
trakt://movies/popular | 基于评分的最受欢迎电影 | 电影标题、年份、受欢迎评分 |
trakt://movies/favorited | 收藏次数最多的电影 | 电影标题、年份、收藏次数 |
trakt://movies/played | 播放次数最多的电影 | 电影标题、年份、播放次数 |
tr/akts://movies/watched | 独立用户观看次数最多的电影 | 电影标题、年份、观看者数量 |
| 资源 | 描述 | 示例数据 |
|---|---|---|
trakt://user/auth/status | 当前认证状态 | 认证状态、令牌过期时间 |
trakt://user/watched/shows | 已认证用户观看过的节目 | 节目标题、年份、最后观看日期、播放次数 |
trakt://user/watched/movies | 已认证用户观看过的电影 | 电影标题、年份、最后观看日期、播放次数 |
MCP工具是AI模型可以调用的交互函数,参数化使用这些工具来获取、搜索和管理Trakt数据。
<details> <summary><strong>节目工具</strong></summary># 获取热门节目:自动分页所有结果(省略page参数)
fetch_trending_shows(limit=10)
# 获取热门节目:单页结果及分页元数据
fetch_trending_shows(limit=10, page=1)
# 获取受欢迎的节目,可选limit参数
fetch_popular_shows(limit=10)
# 获取收藏次数最多的节目,可选limit和period参数
fetch_favorited_shows(limit=10, period="weekly")
# 获取播放次数最多的节目,可选limit和period参数
fetch_played_shows(limit=10, period="weekly")
# 获取观看次数最多的节目,可选limit和period参数
fetch_watched_shows(limit=10, period="weekly")
# 搜索节目:自动分页所有结果(省略page参数)
search_shows(query="Breaking Bad", limit=5)
# 搜索节目:单页结果及分页元数据
search_shows(query="Breaking Bad", limit=5, page=1)
# 获取节目的评分
fetch_show_ratings(show_id="game-of-thrones")
# 获取综合节目概要(包括播出时间、制作状态、评分、元数据)
fetch_show_summary(show_id="game-of-thrones", extended=True) # 默认:综合
# 获取基本节目概要(仅标题、年份、ID)
fetch_show_summary(show_id="game-of-thrones", extended=False)
# 获取节目的视频(默认嵌入Markdown)
fetch_show_videos(show_id="game-of-thrones")
# 获取节目的视频(简单文本链接)
fetch_show_videos(show_id="game-of-thrones", embed_markdown=False)
# 搜索电影:自动分页所有结果(省略page参数)
search_movies(query="The Godfather", limit=5)
# 搜索电影:单页结果及分页元数据
search_movies(query="The Godfather", limit=5, page=1)
</details>
<details>
<summary><strong>电影工具</strong></summary>
# 获取热门电影:自动分页所有结果(省略page参数)
fetch_trending_movies(limit=10)
# 获取热门电影:单页结果及分页元数据
fetch_trending_movies(limit=10, page=1)
# 获取受欢迎的电影,可选limit参数
fetch_popular_movies(limit=10)
# 获取收藏次数最多的电影,可选limit和period参数
fetch_favorited_movies(limit=10, period="weekly")
# 获取播放次数最多的电影,可选limit和period参数
fetch_played_movies(limit=10, period="weekly")
# 获取观看次数最多的电影,可选limit和period参数
fetch_watched_movies(limit=10, period="weekly")
# 获取电影的评分
fetch_movie_ratings(movie_id="tron-legacy-2010")
# 获取综合电影概要(包括制作状态、评分、类型、时长、分级、元数据)
fetch_movie_summary(movie_id="tron-legacy-2010", extended=True) # 默认:综合
# 获取基本电影概要(仅标题、年份、ID)
fetch_movie_summary(movie_id="tron-legacy-2010", extended=False)
# 获取电影的视频(默认嵌入Markdown)
fetch_movie_videos(movie_id="tron-legacy-2010")
# 获取电影的视频(简单文本链接)
fetch_movie_videos(movie_id="tron-legacy-2010", embed_markdown=False)
</details>
<details>
<summary><strong>认证&用户工具</strong></summary>
# 开始与Trakt的设备授权流程
start_device_auth()
# 检查正在进行的认证状态
check_auth_status()
# 清除认证(注销)
clear_auth()
# 获取已认证用户观看过的节目
fetch_user_watched_shows(limit=0) # 0表示所有节目
# 获取已认证用户观看过的电影
fetch_user_watched_movies(limit=0) # 0表示所有电影
# 获取用户个人评分,支持分页
fetch_user_ratings(rating_type="movies", rating=10, page=1)
# 添加新的评分给电影、节目、季或剧集
add_user_ratings(rating_type="movies", items=[{"trakt_id": "314", "rating": 9}])
# 通过ID移除现有评分
remove_user_ratings(rating_type="movies", items=[{"trakt_id": "314"}])
# 获取用户的观看清单,支持分页和排序
fetch_user_watchlist(watchlist_type="all", sort_by="rank", sort_how="asc", page=1)
# 将项目添加到观看清单,可选注释(VIP)
add_user_watchlist(watchlist_type="movies", items=[{"trakt_id": "314", "notes": "必须观看!"}])
# 从观看清单中移除项目
remove_user_watchlist(watchlist_type="movies", items=[{"trakt_id": "314"}])
</details>
<details>
<summary><strong>签到工具</strong></summary>
# 方法1:使用节目ID签到(当精度重要时推荐)
# 首先使用search_shows找到正确的节目ID
search_shows(query="Breaking Bad", limit=5)
# 然后使用ID进行签到
checkin_to_show(
season=1,
episode=3,
show_id="1388",
message="我爱这部剧!"
)
# 方法2:使用节目标题签到(更方便)
checkin_to_show(
season=1,
episode=1,
show_title="Breaking Bad",
show_year=2008, # 可选但有助于准确性
message="我是那个敲门的人!"
)
</details>
<details>
<summary><strong>评论工具</strong></summary>
# 获取电影的评论:自动分页所有结果(省略page参数)
fetch_movie_comments(movie_id="123", limit=10, show_spoilers=False)
# 获取电影的评论:单页结果及分页元数据
fetch_movie_comments(movie_id="123", limit=10, show_spoilers=False, page=1)
# 获取节目的评论:自动分页所有结果(省略page参数)
fetch_show_comments(show_id="456", limit=10, show_spoilers=False, sort="likes")
# 获取节目的评论:单页结果及分页元数据
fetch_show_comments(show_id="456", limit=10, show_spoilers=False, sort="likes", page=1)
# 获取特定季的评论,按最高评分排序
fetch_season_comments(show_id="456", season=1, limit=10, show_spoilers=False, sort="highest")
# 获取特定剧集的评论,按回复数排序
fetch_episode_comments(show_id="456", season=1, episode=3, limit=10, show_spoilers=False, sort="replies")
# 获取特定评论
fetch_comment(comment_id="789", show_spoilers=False)
# 获取评论及其回复,按最早时间排序
fetch_comment_replies(comment_id="789", limit=10, show_spoilers=False, sort="oldest")
</details>
安装完成后,Claude可以使用此MCP服务器回答有关娱乐数据的问题。这里有一些示例问题帮助您入门。
公共数据(无需认证):
个人数据(需要认证):
通过认证,您可以访问: