tv-recommender-mcp-server
Version:
MCP server for TV show recommendations
170 lines (169 loc) • 8.28 kB
JavaScript
;
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)();