UNPKG

tv-recommender-mcp-server

Version:

MCP server for TV show recommendations

170 lines (169 loc) 8.28 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js"); const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js"); const zod_1 = require("zod"); const dotenv_1 = __importDefault(require("dotenv")); const errorHandler_1 = require("./utils/errorHandler"); const tools_1 = require("./tools"); // 加载环境变量 dotenv_1.default.config(); // 移除API密钥检查 - 实现懒加载策略 // API密钥将在实际调用工具时验证,允许在没有API密钥的情况下列出工具 // 初始化MCP服务器 const server = new mcp_js_1.McpServer({ name: "tv-recommender-mcp-server", version: "1.0.0", description: "美剧推荐服务,基于TMDb API提供剧集推荐和详细信息" }); // 注册get_recommendations_by_genre工具 server.tool("get_recommendations_by_genre", { genre: zod_1.z.string().describe('电视剧类型,如"喜剧"、"科幻"、"悬疑"等,支持中英文') }, async (params) => { console.log(`收到按类型获取推荐请求,类型: ${params.genre}`); const results = await (0, tools_1.getRecommendationsByGenre)(params); return { content: [{ type: "text", text: JSON.stringify(results) }] }; }); // 注册get_similar_shows工具 server.tool("get_similar_shows", { show_title: zod_1.z.string().describe('剧集名称,如"怪奇物语"、"绝命毒师"等') }, async (params) => { console.log(`收到获取相似剧集请求,剧集名称: ${params.show_title}`); const results = await (0, tools_1.getSimilarShows)(params); return { content: [{ type: "text", text: JSON.stringify(results) }] }; }); // 注册get_show_details工具 server.tool("get_show_details", { show_title: zod_1.z.string().describe('剧集名称,用于获取详细信息') }, async (params) => { console.log(`收到获取剧集详情请求,剧集名称: ${params.show_title}`); const results = await (0, tools_1.getShowDetails)(params); return { content: [{ type: "text", text: JSON.stringify(results) }] }; }); // 注册get_watch_providers工具 server.tool("get_watch_providers", { show_title: zod_1.z.string().describe('剧集名称,如"怪奇物语"、"绝命毒师"等'), country_code: zod_1.z.string().optional().describe('可选的国家/地区代码,如"US"、"CN"等,默认为"US"') }, async (params) => { console.log(`收到获取观看渠道请求,剧集名称: ${params.show_title},国家/地区: ${params.country_code || 'US'}`); const results = await (0, tools_1.getWatchProviders)(params); return { content: [{ type: "text", text: JSON.stringify(results) }] }; }); // 注册discover_shows工具 server.tool("discover_shows", { with_genres: zod_1.z.array(zod_1.z.string()).optional().describe('类型数组,如["喜剧", "科幻"]'), first_air_date_year: zod_1.z.number().optional().describe('首播年份,如2022'), vote_average_gte: zod_1.z.number().optional().describe('最低评分,如8.0'), with_networks: zod_1.z.array(zod_1.z.number()).optional().describe('电视网络ID数组,如[213]表示Netflix'), with_keywords: zod_1.z.array(zod_1.z.string()).optional().describe('关键词数组,如["机器人", "太空"]'), sort_by: zod_1.z.string().optional().describe('排序方式,如"popularity.desc"'), page: zod_1.z.number().optional().describe('页码,默认为1'), with_original_language: zod_1.z.string().optional().describe('原始语言,如"en"表示英语') }, async (params) => { console.log('收到高级剧集发现请求,参数:', params); const results = await (0, tools_1.discoverShows)(params); return { content: [{ type: "text", text: JSON.stringify(results) }] }; }); // 注册获取演员作品的工具 server.tool("find_shows_by_actor", { actor_name: zod_1.z.string().describe('演员名称,如"布莱恩·科兰斯顿"、"安东尼·斯塔尔"等') }, async (params) => { console.log(`收到获取演员作品请求,演员名称: ${params.actor_name}`); const { findShowsByPersonName } = require('./tools/discoverShowsTool'); const results = await findShowsByPersonName(params.actor_name); return { content: [{ type: "text", text: JSON.stringify(results) }] }; }); // 注册演员推荐工具 server.tool("get_recommendations_by_actor", { actor_name: zod_1.z.string().describe('演员名称,如"布莱恩·科兰斯顿"、"安东尼·斯塔尔"等'), limit: zod_1.z.number().optional().default(10).describe('返回结果数量限制,默认为10') }, async (params) => { console.log(`收到获取演员推荐请求,演员名称: ${params.actor_name},限制: ${params.limit || 10}`); const { getRecommendationsByActor } = require('./tools/discoverShowsTool'); const results = await getRecommendationsByActor(params.actor_name, params.limit); return { content: [{ type: "text", text: JSON.stringify(results) }] }; }); // 注册获取演员信息和作品的工具 server.tool("get_actor_details_and_credits", { actor_name: zod_1.z.string().describe('演员名称,如"布莱恩·科兰斯顿"、"安东尼·斯塔尔"等') }, async (params) => { console.log(`收到获取演员信息和作品请求,演员名称: ${params.actor_name}`); const results = await (0, tools_1.getActorDetailsAndCredits)(params); return { content: [{ type: "text", text: JSON.stringify(results) }] }; }); // 注册评论查询工具 server.tool("get_show_reviews", { show_title: zod_1.z.string().describe('剧集名称,用于获取评论'), page: zod_1.z.number().optional().default(1).describe('页码,默认为1') }, async (params) => { console.log(`收到获取剧集评论请求,剧集名称: ${params.show_title},页码: ${params.page || 1}`); const results = await (0, tools_1.getShowReviews)({ show_title: params.show_title, page: params.page }); return { content: [{ type: "text", text: JSON.stringify(results) }] }; }); // 注册热门与趋势剧集查询工具 server.tool("get_popular_shows", { page: zod_1.z.number().optional().default(1).describe('页码,默认为1') }, async (params) => { console.log(`收到获取热门剧集请求,页码: ${params.page || 1}`); const results = await (0, tools_1.getPopularShows)(params); return { content: [{ type: "text", text: JSON.stringify(results) }] }; }); server.tool("get_trending_shows", { time_window: zod_1.z.enum(['day', 'week']).default('week').describe('时间窗口,day表示日趋势,week表示周趋势,默认为week'), page: zod_1.z.number().optional().default(1).describe('页码,默认为1') }, async (params) => { console.log(`收到获取${params.time_window === 'day' ? '日' : '周'}趋势剧集请求,页码: ${params.page || 1}`); const results = await (0, tools_1.getTrendingShows)(params); return { content: [{ type: "text", text: JSON.stringify(results) }] }; }); // 注册视频查询工具 server.tool("get_show_videos", { show_title: zod_1.z.string().describe('剧集名称,用于获取预告片和视频') }, async (params) => { console.log(`收到获取剧集视频请求,剧集名称: ${params.show_title}`); const results = await (0, tools_1.getShowVideos)(params); return { content: [{ type: "text", text: JSON.stringify(results) }] }; }); // 启动服务器 async function startServer() { try { // 创建标准输入/输出传输 const transport = new stdio_js_1.StdioServerTransport(); console.log('MCP服务器初始化中...'); // 连接到传输 await server.connect(transport); console.log('TV推荐MCP服务器启动成功,正在监听stdin/stdout...'); } catch (error) { console.error('服务器启动失败:', error); process.exit(1); } } // 启动服务器 startServer(); // 注册全局错误处理器 (0, errorHandler_1.registerGlobalErrorHandlers)();