@cyanheads/anime-mcp-server 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +346 -0
- package/CLAUDE.md +346 -0
- package/Dockerfile +99 -0
- package/LICENSE +201 -0
- package/README.md +313 -0
- package/changelog/0.1.x/0.1.1.md +42 -0
- package/changelog/template.md +127 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/prompts/index.d.ts +7 -0
- package/dist/mcp-server/prompts/index.d.ts.map +1 -0
- package/dist/mcp-server/prompts/index.js +7 -0
- package/dist/mcp-server/prompts/index.js.map +1 -0
- package/dist/mcp-server/resources/definitions/anime-media.resource.d.ts +31 -0
- package/dist/mcp-server/resources/definitions/anime-media.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/anime-media.resource.js +100 -0
- package/dist/mcp-server/resources/definitions/anime-media.resource.js.map +1 -0
- package/dist/mcp-server/resources/index.d.ts +29 -0
- package/dist/mcp-server/resources/index.d.ts.map +1 -0
- package/dist/mcp-server/resources/index.js +7 -0
- package/dist/mcp-server/resources/index.js.map +1 -0
- package/dist/mcp-server/tools/definitions/anime-find-characters.tool.d.ts +77 -0
- package/dist/mcp-server/tools/definitions/anime-find-characters.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/anime-find-characters.tool.js +308 -0
- package/dist/mcp-server/tools/definitions/anime-find-characters.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/anime-get-media.tool.d.ts +92 -0
- package/dist/mcp-server/tools/definitions/anime-get-media.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/anime-get-media.tool.js +425 -0
- package/dist/mcp-server/tools/definitions/anime-get-media.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/anime-get-rankings.tool.d.ts +73 -0
- package/dist/mcp-server/tools/definitions/anime-get-rankings.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/anime-get-rankings.tool.js +154 -0
- package/dist/mcp-server/tools/definitions/anime-get-rankings.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/anime-get-recommendations.tool.d.ts +35 -0
- package/dist/mcp-server/tools/definitions/anime-get-recommendations.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/anime-get-recommendations.tool.js +174 -0
- package/dist/mcp-server/tools/definitions/anime-get-recommendations.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/anime-get-relations.tool.d.ts +43 -0
- package/dist/mcp-server/tools/definitions/anime-get-relations.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/anime-get-relations.tool.js +245 -0
- package/dist/mcp-server/tools/definitions/anime-get-relations.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/anime-get-schedule.tool.d.ts +51 -0
- package/dist/mcp-server/tools/definitions/anime-get-schedule.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/anime-get-schedule.tool.js +196 -0
- package/dist/mcp-server/tools/definitions/anime-get-schedule.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/anime-get-studio.tool.d.ts +50 -0
- package/dist/mcp-server/tools/definitions/anime-get-studio.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/anime-get-studio.tool.js +163 -0
- package/dist/mcp-server/tools/definitions/anime-get-studio.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/anime-search-media.tool.d.ts +73 -0
- package/dist/mcp-server/tools/definitions/anime-search-media.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/anime-search-media.tool.js +229 -0
- package/dist/mcp-server/tools/definitions/anime-search-media.tool.js.map +1 -0
- package/dist/mcp-server/tools/index.d.ts +435 -0
- package/dist/mcp-server/tools/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/index.js +23 -0
- package/dist/mcp-server/tools/index.js.map +1 -0
- package/dist/services/anilist/anilist-service.d.ts +90 -0
- package/dist/services/anilist/anilist-service.d.ts.map +1 -0
- package/dist/services/anilist/anilist-service.js +496 -0
- package/dist/services/anilist/anilist-service.js.map +1 -0
- package/dist/services/anilist/types.d.ts +255 -0
- package/dist/services/anilist/types.d.ts.map +1 -0
- package/dist/services/anilist/types.js +6 -0
- package/dist/services/anilist/types.js.map +1 -0
- package/dist/services/jikan/jikan-service.d.ts +22 -0
- package/dist/services/jikan/jikan-service.d.ts.map +1 -0
- package/dist/services/jikan/jikan-service.js +89 -0
- package/dist/services/jikan/jikan-service.js.map +1 -0
- package/dist/services/jikan/types.d.ts +85 -0
- package/dist/services/jikan/types.d.ts.map +1 -0
- package/dist/services/jikan/types.js +6 -0
- package/dist/services/jikan/types.js.map +1 -0
- package/dist/services/kitsu/kitsu-service.d.ts +14 -0
- package/dist/services/kitsu/kitsu-service.d.ts.map +1 -0
- package/dist/services/kitsu/kitsu-service.js +94 -0
- package/dist/services/kitsu/kitsu-service.js.map +1 -0
- package/dist/services/kitsu/types.d.ts +17 -0
- package/dist/services/kitsu/types.d.ts.map +1 -0
- package/dist/services/kitsu/types.js +6 -0
- package/dist/services/kitsu/types.js.map +1 -0
- package/package.json +103 -0
- package/server.json +99 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview anime_get_rankings tool — top, trending, or seasonal rankings.
|
|
3
|
+
* @module mcp-server/tools/definitions/anime-get-rankings.tool
|
|
4
|
+
*/
|
|
5
|
+
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import * as anilist from '../../../services/anilist/anilist-service.js';
|
|
7
|
+
const SeasonEnum = z
|
|
8
|
+
.enum(['WINTER', 'SPRING', 'SUMMER', 'FALL'])
|
|
9
|
+
.describe('Anime broadcast season. WINTER=Jan–Mar, SPRING=Apr–Jun, SUMMER=Jul–Sep, FALL=Oct–Dec.');
|
|
10
|
+
const FormatEnum = z
|
|
11
|
+
.enum(['TV', 'TV_SHORT', 'MOVIE', 'SPECIAL', 'OVA', 'ONA', 'MUSIC', 'MANGA', 'NOVEL', 'ONE_SHOT'])
|
|
12
|
+
.describe('Publication/broadcast format filter.');
|
|
13
|
+
export const animeGetRankings = tool('anime_get_rankings', {
|
|
14
|
+
description: 'Top, trending, or seasonal rankings. Filterable by genre, tag, and format. ' +
|
|
15
|
+
'"top" returns all-time by score; "trending" returns current week; ' +
|
|
16
|
+
'"seasonal" returns the current or specified season sorted by popularity.',
|
|
17
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
18
|
+
input: z.object({
|
|
19
|
+
mode: z
|
|
20
|
+
.enum(['top', 'trending', 'seasonal'])
|
|
21
|
+
.describe('"top": highest-scoring of all time. ' +
|
|
22
|
+
'"trending": most active this week. ' +
|
|
23
|
+
'"seasonal": most popular in the current or specified season/year.'),
|
|
24
|
+
media_type: z.enum(['ANIME', 'MANGA']).describe('Media type to rank.'),
|
|
25
|
+
format: FormatEnum.optional(),
|
|
26
|
+
genre: z.string().max(100).optional().describe('Genre filter, e.g. "Action", "Romance".'),
|
|
27
|
+
season: SeasonEnum.optional().describe('Season for "seasonal" mode. Defaults to current season.'),
|
|
28
|
+
season_year: z
|
|
29
|
+
.number()
|
|
30
|
+
.int()
|
|
31
|
+
.min(1940)
|
|
32
|
+
.max(2100)
|
|
33
|
+
.optional()
|
|
34
|
+
.describe('Year for "seasonal" mode. Defaults to current year.'),
|
|
35
|
+
page: z.number().int().min(1).default(1).describe('1-based page number.'),
|
|
36
|
+
per_page: z.number().int().min(1).max(50).default(25).describe('Results per page. Maximum 50.'),
|
|
37
|
+
include_adult: z
|
|
38
|
+
.boolean()
|
|
39
|
+
.default(false)
|
|
40
|
+
.describe('Include adult/NSFW content. Default false.'),
|
|
41
|
+
}),
|
|
42
|
+
output: z.object({
|
|
43
|
+
mode: z.enum(['top', 'trending', 'seasonal']).describe('Ranking mode used.'),
|
|
44
|
+
media_type: z.enum(['ANIME', 'MANGA']).describe('Media type ranked.'),
|
|
45
|
+
season_label: z
|
|
46
|
+
.string()
|
|
47
|
+
.nullable()
|
|
48
|
+
.describe('Season label for seasonal mode, e.g. "FALL 2024", or null.'),
|
|
49
|
+
page: z.number().int().describe('Current page number.'),
|
|
50
|
+
has_next_page: z.boolean().describe('Whether more pages are available.'),
|
|
51
|
+
total_results: z.number().int().nullable().describe('Total matching results, or null.'),
|
|
52
|
+
entries: z
|
|
53
|
+
.array(z
|
|
54
|
+
.object({
|
|
55
|
+
rank: z.number().int().describe('1-based rank position on this page.'),
|
|
56
|
+
id: z.number().int().describe('AniList media ID.'),
|
|
57
|
+
id_mal: z.number().int().nullable().describe('MyAnimeList ID, or null.'),
|
|
58
|
+
title: z.string().nullable().describe('Romanized title.'),
|
|
59
|
+
title_english: z.string().nullable().describe('English title, or null.'),
|
|
60
|
+
type: z.enum(['ANIME', 'MANGA']).describe('Media type.'),
|
|
61
|
+
format: z.string().nullable().describe('Format: TV, MOVIE, OVA, etc.'),
|
|
62
|
+
status: z.string().nullable().describe('Production status.'),
|
|
63
|
+
season: z.string().nullable().describe('Broadcast season label, or null.'),
|
|
64
|
+
episodes: z.number().int().nullable().describe('Episode count, or null.'),
|
|
65
|
+
chapters: z.number().int().nullable().describe('Chapter count, or null.'),
|
|
66
|
+
mean_score: z.number().nullable().describe('AniList mean score 0–100, or null.'),
|
|
67
|
+
is_adult: z.boolean().describe('Whether marked adult/NSFW.'),
|
|
68
|
+
cover_image_url: z.string().nullable().describe('Cover image URL, or null.'),
|
|
69
|
+
})
|
|
70
|
+
.describe('A ranked media entry.'))
|
|
71
|
+
.describe('Ranked entries.'),
|
|
72
|
+
}),
|
|
73
|
+
async handler(input, ctx) {
|
|
74
|
+
ctx.log.info('Fetching rankings', { mode: input.mode, mediaType: input.media_type });
|
|
75
|
+
const page = await anilist.getRankings({
|
|
76
|
+
mediaType: input.media_type,
|
|
77
|
+
mode: input.mode,
|
|
78
|
+
format: input.format,
|
|
79
|
+
genre: input.genre,
|
|
80
|
+
season: input.season,
|
|
81
|
+
seasonYear: input.season_year,
|
|
82
|
+
page: input.page,
|
|
83
|
+
perPage: input.per_page,
|
|
84
|
+
includeAdult: input.include_adult,
|
|
85
|
+
});
|
|
86
|
+
// Compute season label for seasonal mode
|
|
87
|
+
let seasonLabel = null;
|
|
88
|
+
if (input.mode === 'seasonal') {
|
|
89
|
+
if (input.season && input.season_year) {
|
|
90
|
+
seasonLabel = `${input.season} ${input.season_year}`;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
// Auto-computed in service
|
|
94
|
+
const now = new Date();
|
|
95
|
+
const month = now.getMonth() + 1;
|
|
96
|
+
const year = now.getFullYear();
|
|
97
|
+
const season = month <= 3 ? 'WINTER' : month <= 6 ? 'SPRING' : month <= 9 ? 'SUMMER' : 'FALL';
|
|
98
|
+
seasonLabel = `${season} ${year}`;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const startRank = (input.page - 1) * input.per_page + 1;
|
|
102
|
+
return {
|
|
103
|
+
mode: input.mode,
|
|
104
|
+
media_type: input.media_type,
|
|
105
|
+
season_label: seasonLabel,
|
|
106
|
+
page: page.pageInfo.currentPage,
|
|
107
|
+
has_next_page: page.pageInfo.hasNextPage,
|
|
108
|
+
total_results: page.pageInfo.total ?? null,
|
|
109
|
+
entries: page.media.map((m, idx) => ({
|
|
110
|
+
rank: startRank + idx,
|
|
111
|
+
id: m.id,
|
|
112
|
+
id_mal: m.idMal ?? null,
|
|
113
|
+
title: m.title.romaji,
|
|
114
|
+
title_english: m.title.english,
|
|
115
|
+
type: m.type,
|
|
116
|
+
format: m.format ?? null,
|
|
117
|
+
status: m.status ?? null,
|
|
118
|
+
season: m.season && m.seasonYear ? `${m.season} ${m.seasonYear}` : (m.season ?? null),
|
|
119
|
+
episodes: m.episodes ?? null,
|
|
120
|
+
chapters: m.chapters ?? null,
|
|
121
|
+
mean_score: m.meanScore ?? null,
|
|
122
|
+
is_adult: m.isAdult,
|
|
123
|
+
cover_image_url: m.coverImage?.large ?? null,
|
|
124
|
+
})),
|
|
125
|
+
};
|
|
126
|
+
},
|
|
127
|
+
format: (result) => {
|
|
128
|
+
const modeLabel = result.mode === 'top'
|
|
129
|
+
? `All-Time Top ${result.media_type}`
|
|
130
|
+
: result.mode === 'trending'
|
|
131
|
+
? `Trending ${result.media_type}`
|
|
132
|
+
: `${result.season_label ?? 'Current Season'} ${result.media_type}`;
|
|
133
|
+
const lines = [
|
|
134
|
+
`## ${modeLabel}`,
|
|
135
|
+
`mode: ${result.mode} | season_label: ${result.season_label ?? 'none'}`,
|
|
136
|
+
`Page ${result.page}${result.total_results !== null ? ` · ${result.total_results} total` : ''}`,
|
|
137
|
+
'',
|
|
138
|
+
];
|
|
139
|
+
for (const entry of result.entries) {
|
|
140
|
+
const title = entry.title_english ?? entry.title ?? 'Unknown';
|
|
141
|
+
const score = entry.mean_score !== null ? ` · ${entry.mean_score}/100` : '';
|
|
142
|
+
const fmt = entry.format ? ` · ${entry.format}` : '';
|
|
143
|
+
const ep = entry.episodes !== null ? ` · ${entry.episodes} eps` : '';
|
|
144
|
+
const chap = entry.chapters !== null ? ` chapters:${entry.chapters}` : '';
|
|
145
|
+
const adult = entry.is_adult ? ' · [Adult]' : '';
|
|
146
|
+
lines.push(`${entry.rank}. **${title}** (${entry.title ?? '?'}) [AL:${entry.id}${entry.id_mal !== null ? `/MAL:${entry.id_mal}` : ''}]${fmt}${score}${ep}${chap}${adult}`, ` status: ${entry.status ?? 'N/A'} | season: ${entry.season ?? 'N/A'} | cover: ${entry.cover_image_url ?? 'none'}`);
|
|
147
|
+
}
|
|
148
|
+
if (result.has_next_page) {
|
|
149
|
+
lines.push('', `_More results available (page ${result.page + 1})._`);
|
|
150
|
+
}
|
|
151
|
+
return [{ type: 'text', text: lines.join('\n') }];
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
//# sourceMappingURL=anime-get-rankings.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anime-get-rankings.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/anime-get-rankings.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview anime_get_recommendations tool — merged recommendations from AniList and Jikan.
|
|
3
|
+
* @module mcp-server/tools/definitions/anime-get-recommendations.tool
|
|
4
|
+
*/
|
|
5
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
export declare const animeGetRecommendations: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
7
|
+
id: z.ZodNumber;
|
|
8
|
+
liked_aspects: z.ZodOptional<z.ZodString>;
|
|
9
|
+
page: z.ZodDefault<z.ZodNumber>;
|
|
10
|
+
per_page: z.ZodDefault<z.ZodNumber>;
|
|
11
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
12
|
+
source_id: z.ZodNumber;
|
|
13
|
+
source_id_mal: z.ZodNullable<z.ZodNumber>;
|
|
14
|
+
source_type: z.ZodNullable<z.ZodString>;
|
|
15
|
+
liked_aspects: z.ZodNullable<z.ZodString>;
|
|
16
|
+
has_next_page: z.ZodBoolean;
|
|
17
|
+
recommendations: z.ZodArray<z.ZodObject<{
|
|
18
|
+
id: z.ZodNumber;
|
|
19
|
+
id_mal: z.ZodNullable<z.ZodNumber>;
|
|
20
|
+
title: z.ZodNullable<z.ZodString>;
|
|
21
|
+
title_english: z.ZodNullable<z.ZodString>;
|
|
22
|
+
type: z.ZodNullable<z.ZodString>;
|
|
23
|
+
format: z.ZodNullable<z.ZodString>;
|
|
24
|
+
status: z.ZodNullable<z.ZodString>;
|
|
25
|
+
mean_score: z.ZodNullable<z.ZodNumber>;
|
|
26
|
+
cover_image_url: z.ZodNullable<z.ZodString>;
|
|
27
|
+
anilist_rating: z.ZodNullable<z.ZodNumber>;
|
|
28
|
+
jikan_votes: z.ZodNullable<z.ZodNumber>;
|
|
29
|
+
sources: z.ZodArray<z.ZodEnum<{
|
|
30
|
+
anilist: "anilist";
|
|
31
|
+
jikan: "jikan";
|
|
32
|
+
}>>;
|
|
33
|
+
}, z.core.$strip>>;
|
|
34
|
+
}, z.core.$strip>, undefined, undefined>;
|
|
35
|
+
//# sourceMappingURL=anime-get-recommendations.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anime-get-recommendations.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/anime-get-recommendations.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAKjD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;wCAoMlC,CAAC"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview anime_get_recommendations tool — merged recommendations from AniList and Jikan.
|
|
3
|
+
* @module mcp-server/tools/definitions/anime-get-recommendations.tool
|
|
4
|
+
*/
|
|
5
|
+
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import * as anilist from '../../../services/anilist/anilist-service.js';
|
|
7
|
+
import * as jikan from '../../../services/jikan/jikan-service.js';
|
|
8
|
+
export const animeGetRecommendations = tool('anime_get_recommendations', {
|
|
9
|
+
description: 'Recommendations for a title, merged from AniList and Jikan (MAL), with scores and vote counts. ' +
|
|
10
|
+
'AniList recommendations use community rating scores; Jikan adds MAL user recommendations with vote counts. ' +
|
|
11
|
+
'Both sources are surfaced separately — not blended into a composite score.',
|
|
12
|
+
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
13
|
+
input: z.object({
|
|
14
|
+
id: z
|
|
15
|
+
.number()
|
|
16
|
+
.int()
|
|
17
|
+
.min(1)
|
|
18
|
+
.describe('AniList media ID of the title to get recommendations for.'),
|
|
19
|
+
liked_aspects: z
|
|
20
|
+
.string()
|
|
21
|
+
.max(500)
|
|
22
|
+
.optional()
|
|
23
|
+
.describe('Optional: what you liked about this title (e.g. "the slow-burn romance" or "mecha action"). ' +
|
|
24
|
+
'Included in the output for context; the agent can use it to highlight relevant picks.'),
|
|
25
|
+
page: z
|
|
26
|
+
.number()
|
|
27
|
+
.int()
|
|
28
|
+
.min(1)
|
|
29
|
+
.default(1)
|
|
30
|
+
.describe('1-based page number for AniList recommendations.'),
|
|
31
|
+
per_page: z
|
|
32
|
+
.number()
|
|
33
|
+
.int()
|
|
34
|
+
.min(1)
|
|
35
|
+
.max(25)
|
|
36
|
+
.default(25)
|
|
37
|
+
.describe('Recommendations per page from AniList. Maximum 25.'),
|
|
38
|
+
}),
|
|
39
|
+
output: z.object({
|
|
40
|
+
source_id: z.number().int().describe('AniList ID of the source title.'),
|
|
41
|
+
source_id_mal: z.number().int().nullable().describe('MAL ID of the source title, or null.'),
|
|
42
|
+
source_type: z.string().nullable().describe('Source media type: ANIME or MANGA.'),
|
|
43
|
+
liked_aspects: z.string().nullable().describe('Liked aspects provided by the caller, or null.'),
|
|
44
|
+
has_next_page: z.boolean().describe('Whether more AniList recommendations are available.'),
|
|
45
|
+
recommendations: z
|
|
46
|
+
.array(z
|
|
47
|
+
.object({
|
|
48
|
+
id: z.number().int().describe('AniList media ID of the recommended title.'),
|
|
49
|
+
id_mal: z
|
|
50
|
+
.number()
|
|
51
|
+
.int()
|
|
52
|
+
.nullable()
|
|
53
|
+
.describe('MAL ID of the recommended title, or null.'),
|
|
54
|
+
title: z.string().nullable().describe('Romanized title.'),
|
|
55
|
+
title_english: z.string().nullable().describe('English title, or null.'),
|
|
56
|
+
type: z.string().nullable().describe('Media type.'),
|
|
57
|
+
format: z.string().nullable().describe('Format: TV, MOVIE, OVA, etc.'),
|
|
58
|
+
status: z.string().nullable().describe('Production status.'),
|
|
59
|
+
mean_score: z.number().nullable().describe('AniList mean score 0–100, or null.'),
|
|
60
|
+
cover_image_url: z.string().nullable().describe('Cover image URL, or null.'),
|
|
61
|
+
anilist_rating: z
|
|
62
|
+
.number()
|
|
63
|
+
.int()
|
|
64
|
+
.nullable()
|
|
65
|
+
.describe('AniList community recommendation rating. Higher = more recommended.'),
|
|
66
|
+
jikan_votes: z
|
|
67
|
+
.number()
|
|
68
|
+
.int()
|
|
69
|
+
.nullable()
|
|
70
|
+
.describe('MAL user recommendation vote count, or null when not in Jikan results.'),
|
|
71
|
+
sources: z
|
|
72
|
+
.array(z
|
|
73
|
+
.enum(['anilist', 'jikan'])
|
|
74
|
+
.describe('A source that includes this recommendation.'))
|
|
75
|
+
.describe('Which sources include this recommendation.'),
|
|
76
|
+
})
|
|
77
|
+
.describe('A recommendation entry.'))
|
|
78
|
+
.describe('Merged recommendations, sorted by AniList rating descending. ' +
|
|
79
|
+
'Items appear once even if both sources recommend them; sources array lists all contributors.'),
|
|
80
|
+
}),
|
|
81
|
+
async handler(input, ctx) {
|
|
82
|
+
ctx.log.info('Fetching recommendations', { id: input.id });
|
|
83
|
+
// Get AniList recs — also fetches idMal for Jikan fan-out
|
|
84
|
+
const anilistRecs = await anilist.getRecommendations({
|
|
85
|
+
mediaId: input.id,
|
|
86
|
+
page: input.page,
|
|
87
|
+
perPage: input.per_page,
|
|
88
|
+
});
|
|
89
|
+
// Need media detail for idMal and type
|
|
90
|
+
const mediaDetail = await anilist.getMediaById(input.id);
|
|
91
|
+
const idMal = mediaDetail?.idMal ?? null;
|
|
92
|
+
const mediaType = mediaDetail?.type ?? 'ANIME';
|
|
93
|
+
// Fetch Jikan recs (supplement — degrades gracefully)
|
|
94
|
+
let jikanRecs = [];
|
|
95
|
+
if (idMal) {
|
|
96
|
+
try {
|
|
97
|
+
jikanRecs = await jikan.getRecommendations(idMal, mediaType);
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
ctx.log.warning('Jikan recommendations failed', { error: String(err) });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Build Jikan vote map keyed by MAL ID
|
|
104
|
+
const jikanVoteMap = new Map();
|
|
105
|
+
for (const rec of jikanRecs) {
|
|
106
|
+
jikanVoteMap.set(rec.entry.mal_id, rec.votes);
|
|
107
|
+
}
|
|
108
|
+
// Merge: AniList records are primary, supplement with Jikan votes
|
|
109
|
+
const merged = anilistRecs.nodes
|
|
110
|
+
.filter((n) => n.mediaRecommendation !== null)
|
|
111
|
+
.map((n) => {
|
|
112
|
+
const m = n.mediaRecommendation;
|
|
113
|
+
const jikanVotes = m.idMal ? (jikanVoteMap.get(m.idMal) ?? null) : null;
|
|
114
|
+
// Remove from Jikan map so we know what's left (Jikan-only recs)
|
|
115
|
+
if (m.idMal)
|
|
116
|
+
jikanVoteMap.delete(m.idMal);
|
|
117
|
+
const sources = ['anilist'];
|
|
118
|
+
if (jikanVotes !== null)
|
|
119
|
+
sources.push('jikan');
|
|
120
|
+
return {
|
|
121
|
+
id: m.id,
|
|
122
|
+
id_mal: m.idMal ?? null,
|
|
123
|
+
title: m.title.romaji,
|
|
124
|
+
title_english: m.title.english,
|
|
125
|
+
type: m.type ?? null,
|
|
126
|
+
format: m.format ?? null,
|
|
127
|
+
status: m.status ?? null,
|
|
128
|
+
mean_score: m.meanScore ?? null,
|
|
129
|
+
cover_image_url: m.coverImage?.large ?? null,
|
|
130
|
+
anilist_rating: n.rating ?? null,
|
|
131
|
+
jikan_votes: jikanVotes,
|
|
132
|
+
sources,
|
|
133
|
+
};
|
|
134
|
+
});
|
|
135
|
+
// Sort by AniList rating descending
|
|
136
|
+
merged.sort((a, b) => (b.anilist_rating ?? 0) - (a.anilist_rating ?? 0));
|
|
137
|
+
return {
|
|
138
|
+
source_id: input.id,
|
|
139
|
+
source_id_mal: idMal,
|
|
140
|
+
source_type: mediaType,
|
|
141
|
+
liked_aspects: input.liked_aspects ?? null,
|
|
142
|
+
has_next_page: anilistRecs.hasNextPage,
|
|
143
|
+
recommendations: merged,
|
|
144
|
+
};
|
|
145
|
+
},
|
|
146
|
+
format: (result) => {
|
|
147
|
+
const lines = [
|
|
148
|
+
`## Recommendations for AL:${result.source_id}${result.source_id_mal ? ` / MAL:${result.source_id_mal}` : ''}`,
|
|
149
|
+
`source_type: ${result.source_type ?? 'N/A'}`,
|
|
150
|
+
];
|
|
151
|
+
if (result.liked_aspects) {
|
|
152
|
+
lines.push(`_Based on liking: "${result.liked_aspects}"_`);
|
|
153
|
+
}
|
|
154
|
+
lines.push('');
|
|
155
|
+
if (result.recommendations.length === 0) {
|
|
156
|
+
lines.push('No recommendations found.');
|
|
157
|
+
return [{ type: 'text', text: lines.join('\n') }];
|
|
158
|
+
}
|
|
159
|
+
for (const rec of result.recommendations) {
|
|
160
|
+
const title = rec.title_english ?? rec.title ?? 'Unknown';
|
|
161
|
+
const score = rec.mean_score !== null ? ` · ${rec.mean_score}/100` : '';
|
|
162
|
+
const fmt = rec.format ? ` · ${rec.format}` : '';
|
|
163
|
+
const alRating = rec.anilist_rating !== null ? ` · AL rating: ${rec.anilist_rating}` : '';
|
|
164
|
+
const jVotes = rec.jikan_votes !== null ? ` · MAL votes: ${rec.jikan_votes}` : '';
|
|
165
|
+
const sources = rec.sources.join('+');
|
|
166
|
+
lines.push(`**${title}** (${rec.title ?? '?'}) [AL:${rec.id}${rec.id_mal !== null ? `/MAL:${rec.id_mal}` : ''}] type:${rec.type ?? 'N/A'}${fmt}${score}${alRating}${jVotes} _(${sources})_`, ` status: ${rec.status ?? 'N/A'} | cover: ${rec.cover_image_url ?? 'none'}`);
|
|
167
|
+
}
|
|
168
|
+
if (result.has_next_page) {
|
|
169
|
+
lines.push('', `_More recommendations available (page ${result.recommendations.length > 0 ? 'next' : '1'})._`);
|
|
170
|
+
}
|
|
171
|
+
return [{ type: 'text', text: lines.join('\n') }];
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
//# sourceMappingURL=anime-get-recommendations.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anime-get-recommendations.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/anime-get-recommendations.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview anime_get_relations tool — franchise watch/read order via multi-hop relation graph traversal.
|
|
3
|
+
* BFS over AniList relation edges up to max_depth, then topological sort for recommended order.
|
|
4
|
+
* @module mcp-server/tools/definitions/anime-get-relations.tool
|
|
5
|
+
*/
|
|
6
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
7
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
8
|
+
export declare const animeGetRelations: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
9
|
+
id: z.ZodNumber;
|
|
10
|
+
max_depth: z.ZodDefault<z.ZodNumber>;
|
|
11
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
12
|
+
root_id: z.ZodNumber;
|
|
13
|
+
total_entries: z.ZodNumber;
|
|
14
|
+
depth_reached: z.ZodNumber;
|
|
15
|
+
entries: z.ZodArray<z.ZodObject<{
|
|
16
|
+
id: z.ZodNumber;
|
|
17
|
+
id_mal: z.ZodNullable<z.ZodNumber>;
|
|
18
|
+
title: z.ZodNullable<z.ZodString>;
|
|
19
|
+
title_english: z.ZodNullable<z.ZodString>;
|
|
20
|
+
type: z.ZodNullable<z.ZodString>;
|
|
21
|
+
format: z.ZodNullable<z.ZodString>;
|
|
22
|
+
status: z.ZodNullable<z.ZodString>;
|
|
23
|
+
season: z.ZodNullable<z.ZodString>;
|
|
24
|
+
season_year: z.ZodNullable<z.ZodNumber>;
|
|
25
|
+
episodes: z.ZodNullable<z.ZodNumber>;
|
|
26
|
+
chapters: z.ZodNullable<z.ZodNumber>;
|
|
27
|
+
mean_score: z.ZodNullable<z.ZodNumber>;
|
|
28
|
+
is_adult: z.ZodBoolean;
|
|
29
|
+
cover_image_url: z.ZodNullable<z.ZodString>;
|
|
30
|
+
relation_to_root: z.ZodNullable<z.ZodString>;
|
|
31
|
+
watch_order_category: z.ZodEnum<{
|
|
32
|
+
main: "main";
|
|
33
|
+
supplementary: "supplementary";
|
|
34
|
+
}>;
|
|
35
|
+
is_root: z.ZodBoolean;
|
|
36
|
+
}, z.core.$strip>>;
|
|
37
|
+
}, z.core.$strip>, readonly [{
|
|
38
|
+
readonly reason: "not_found";
|
|
39
|
+
readonly code: JsonRpcErrorCode.NotFound;
|
|
40
|
+
readonly when: "Root media ID not found on AniList";
|
|
41
|
+
readonly recovery: "Use anime_search_media to find a valid AniList ID and retry.";
|
|
42
|
+
}], undefined>;
|
|
43
|
+
//# sourceMappingURL=anime-get-relations.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anime-get-relations.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/anime-get-relations.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAgCjE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAwP5B,CAAC"}
|