@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.
Files changed (85) hide show
  1. package/AGENTS.md +346 -0
  2. package/CLAUDE.md +346 -0
  3. package/Dockerfile +99 -0
  4. package/LICENSE +201 -0
  5. package/README.md +313 -0
  6. package/changelog/0.1.x/0.1.1.md +42 -0
  7. package/changelog/template.md +127 -0
  8. package/dist/index.d.ts +8 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +24 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/mcp-server/prompts/index.d.ts +7 -0
  13. package/dist/mcp-server/prompts/index.d.ts.map +1 -0
  14. package/dist/mcp-server/prompts/index.js +7 -0
  15. package/dist/mcp-server/prompts/index.js.map +1 -0
  16. package/dist/mcp-server/resources/definitions/anime-media.resource.d.ts +31 -0
  17. package/dist/mcp-server/resources/definitions/anime-media.resource.d.ts.map +1 -0
  18. package/dist/mcp-server/resources/definitions/anime-media.resource.js +100 -0
  19. package/dist/mcp-server/resources/definitions/anime-media.resource.js.map +1 -0
  20. package/dist/mcp-server/resources/index.d.ts +29 -0
  21. package/dist/mcp-server/resources/index.d.ts.map +1 -0
  22. package/dist/mcp-server/resources/index.js +7 -0
  23. package/dist/mcp-server/resources/index.js.map +1 -0
  24. package/dist/mcp-server/tools/definitions/anime-find-characters.tool.d.ts +77 -0
  25. package/dist/mcp-server/tools/definitions/anime-find-characters.tool.d.ts.map +1 -0
  26. package/dist/mcp-server/tools/definitions/anime-find-characters.tool.js +308 -0
  27. package/dist/mcp-server/tools/definitions/anime-find-characters.tool.js.map +1 -0
  28. package/dist/mcp-server/tools/definitions/anime-get-media.tool.d.ts +92 -0
  29. package/dist/mcp-server/tools/definitions/anime-get-media.tool.d.ts.map +1 -0
  30. package/dist/mcp-server/tools/definitions/anime-get-media.tool.js +425 -0
  31. package/dist/mcp-server/tools/definitions/anime-get-media.tool.js.map +1 -0
  32. package/dist/mcp-server/tools/definitions/anime-get-rankings.tool.d.ts +73 -0
  33. package/dist/mcp-server/tools/definitions/anime-get-rankings.tool.d.ts.map +1 -0
  34. package/dist/mcp-server/tools/definitions/anime-get-rankings.tool.js +154 -0
  35. package/dist/mcp-server/tools/definitions/anime-get-rankings.tool.js.map +1 -0
  36. package/dist/mcp-server/tools/definitions/anime-get-recommendations.tool.d.ts +35 -0
  37. package/dist/mcp-server/tools/definitions/anime-get-recommendations.tool.d.ts.map +1 -0
  38. package/dist/mcp-server/tools/definitions/anime-get-recommendations.tool.js +174 -0
  39. package/dist/mcp-server/tools/definitions/anime-get-recommendations.tool.js.map +1 -0
  40. package/dist/mcp-server/tools/definitions/anime-get-relations.tool.d.ts +43 -0
  41. package/dist/mcp-server/tools/definitions/anime-get-relations.tool.d.ts.map +1 -0
  42. package/dist/mcp-server/tools/definitions/anime-get-relations.tool.js +245 -0
  43. package/dist/mcp-server/tools/definitions/anime-get-relations.tool.js.map +1 -0
  44. package/dist/mcp-server/tools/definitions/anime-get-schedule.tool.d.ts +51 -0
  45. package/dist/mcp-server/tools/definitions/anime-get-schedule.tool.d.ts.map +1 -0
  46. package/dist/mcp-server/tools/definitions/anime-get-schedule.tool.js +196 -0
  47. package/dist/mcp-server/tools/definitions/anime-get-schedule.tool.js.map +1 -0
  48. package/dist/mcp-server/tools/definitions/anime-get-studio.tool.d.ts +50 -0
  49. package/dist/mcp-server/tools/definitions/anime-get-studio.tool.d.ts.map +1 -0
  50. package/dist/mcp-server/tools/definitions/anime-get-studio.tool.js +163 -0
  51. package/dist/mcp-server/tools/definitions/anime-get-studio.tool.js.map +1 -0
  52. package/dist/mcp-server/tools/definitions/anime-search-media.tool.d.ts +73 -0
  53. package/dist/mcp-server/tools/definitions/anime-search-media.tool.d.ts.map +1 -0
  54. package/dist/mcp-server/tools/definitions/anime-search-media.tool.js +229 -0
  55. package/dist/mcp-server/tools/definitions/anime-search-media.tool.js.map +1 -0
  56. package/dist/mcp-server/tools/index.d.ts +435 -0
  57. package/dist/mcp-server/tools/index.d.ts.map +1 -0
  58. package/dist/mcp-server/tools/index.js +23 -0
  59. package/dist/mcp-server/tools/index.js.map +1 -0
  60. package/dist/services/anilist/anilist-service.d.ts +90 -0
  61. package/dist/services/anilist/anilist-service.d.ts.map +1 -0
  62. package/dist/services/anilist/anilist-service.js +496 -0
  63. package/dist/services/anilist/anilist-service.js.map +1 -0
  64. package/dist/services/anilist/types.d.ts +255 -0
  65. package/dist/services/anilist/types.d.ts.map +1 -0
  66. package/dist/services/anilist/types.js +6 -0
  67. package/dist/services/anilist/types.js.map +1 -0
  68. package/dist/services/jikan/jikan-service.d.ts +22 -0
  69. package/dist/services/jikan/jikan-service.d.ts.map +1 -0
  70. package/dist/services/jikan/jikan-service.js +89 -0
  71. package/dist/services/jikan/jikan-service.js.map +1 -0
  72. package/dist/services/jikan/types.d.ts +85 -0
  73. package/dist/services/jikan/types.d.ts.map +1 -0
  74. package/dist/services/jikan/types.js +6 -0
  75. package/dist/services/jikan/types.js.map +1 -0
  76. package/dist/services/kitsu/kitsu-service.d.ts +14 -0
  77. package/dist/services/kitsu/kitsu-service.d.ts.map +1 -0
  78. package/dist/services/kitsu/kitsu-service.js +94 -0
  79. package/dist/services/kitsu/kitsu-service.js.map +1 -0
  80. package/dist/services/kitsu/types.d.ts +17 -0
  81. package/dist/services/kitsu/types.d.ts.map +1 -0
  82. package/dist/services/kitsu/types.js +6 -0
  83. package/dist/services/kitsu/types.js.map +1 -0
  84. package/package.json +103 -0
  85. package/server.json +99 -0
@@ -0,0 +1,92 @@
1
+ /**
2
+ * @fileoverview anime_get_media tool — full detail for one anime or manga by AniList ID.
3
+ * Fans out to Jikan (MAL score) and Kitsu (streaming links) in parallel.
4
+ * @module mcp-server/tools/definitions/anime-get-media.tool
5
+ */
6
+ import { z } from '@cyanheads/mcp-ts-core';
7
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
8
+ export declare const animeGetMedia: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
9
+ id: z.ZodNumber;
10
+ include_adult: z.ZodDefault<z.ZodBoolean>;
11
+ }, z.core.$strip>, z.ZodObject<{
12
+ id: z.ZodNumber;
13
+ id_mal: z.ZodNullable<z.ZodNumber>;
14
+ type: z.ZodEnum<{
15
+ ANIME: "ANIME";
16
+ MANGA: "MANGA";
17
+ }>;
18
+ title: z.ZodObject<{
19
+ romaji: z.ZodNullable<z.ZodString>;
20
+ english: z.ZodNullable<z.ZodString>;
21
+ native: z.ZodNullable<z.ZodString>;
22
+ }, z.core.$strip>;
23
+ format: z.ZodNullable<z.ZodString>;
24
+ status: z.ZodNullable<z.ZodString>;
25
+ season: z.ZodNullable<z.ZodString>;
26
+ description: z.ZodNullable<z.ZodString>;
27
+ source: z.ZodNullable<z.ZodString>;
28
+ episodes: z.ZodNullable<z.ZodNumber>;
29
+ chapters: z.ZodNullable<z.ZodNumber>;
30
+ volumes: z.ZodNullable<z.ZodNumber>;
31
+ genres: z.ZodArray<z.ZodString>;
32
+ tags: z.ZodArray<z.ZodObject<{
33
+ name: z.ZodString;
34
+ category: z.ZodNullable<z.ZodString>;
35
+ rank: z.ZodNullable<z.ZodNumber>;
36
+ is_spoiler: z.ZodBoolean;
37
+ is_adult: z.ZodBoolean;
38
+ }, z.core.$strip>>;
39
+ studios: z.ZodArray<z.ZodObject<{
40
+ id: z.ZodNumber;
41
+ name: z.ZodString;
42
+ is_main: z.ZodBoolean;
43
+ is_animation_studio: z.ZodBoolean;
44
+ }, z.core.$strip>>;
45
+ scores: z.ZodObject<{
46
+ anilist_mean: z.ZodNullable<z.ZodNumber>;
47
+ anilist_average: z.ZodNullable<z.ZodNumber>;
48
+ anilist_popularity: z.ZodNullable<z.ZodNumber>;
49
+ mal_score: z.ZodNullable<z.ZodNumber>;
50
+ mal_scored_by: z.ZodNullable<z.ZodNumber>;
51
+ mal_rank: z.ZodNullable<z.ZodNumber>;
52
+ mal_popularity: z.ZodNullable<z.ZodNumber>;
53
+ }, z.core.$strip>;
54
+ streaming_links: z.ZodArray<z.ZodObject<{
55
+ site: z.ZodString;
56
+ url: z.ZodString;
57
+ subs: z.ZodArray<z.ZodString>;
58
+ dubs: z.ZodArray<z.ZodString>;
59
+ source: z.ZodEnum<{
60
+ kitsu: "kitsu";
61
+ anilist: "anilist";
62
+ }>;
63
+ }, z.core.$strip>>;
64
+ relations: z.ZodArray<z.ZodObject<{
65
+ relation_type: z.ZodString;
66
+ id: z.ZodNumber;
67
+ title: z.ZodNullable<z.ZodString>;
68
+ type: z.ZodNullable<z.ZodString>;
69
+ format: z.ZodNullable<z.ZodString>;
70
+ status: z.ZodNullable<z.ZodString>;
71
+ }, z.core.$strip>>;
72
+ cover_image_url: z.ZodNullable<z.ZodString>;
73
+ banner_image_url: z.ZodNullable<z.ZodString>;
74
+ site_url: z.ZodNullable<z.ZodString>;
75
+ next_airing: z.ZodNullable<z.ZodObject<{
76
+ episode: z.ZodNumber;
77
+ airing_at_utc: z.ZodString;
78
+ time_until_airing_seconds: z.ZodNumber;
79
+ }, z.core.$strip>>;
80
+ is_adult: z.ZodBoolean;
81
+ data_sources: z.ZodObject<{
82
+ anilist: z.ZodBoolean;
83
+ mal: z.ZodBoolean;
84
+ kitsu: z.ZodBoolean;
85
+ }, z.core.$strip>;
86
+ }, z.core.$strip>, readonly [{
87
+ readonly reason: "not_found";
88
+ readonly code: JsonRpcErrorCode.NotFound;
89
+ readonly when: "AniList returns null for the given ID (invalid or nonexistent)";
90
+ readonly recovery: "Use anime_search_media to find a valid AniList ID and retry.";
91
+ }], undefined>;
92
+ //# sourceMappingURL=anime-get-media.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anime-get-media.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/anime-get-media.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAKjE,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA+cxB,CAAC"}
@@ -0,0 +1,425 @@
1
+ /**
2
+ * @fileoverview anime_get_media tool — full detail for one anime or manga by AniList ID.
3
+ * Fans out to Jikan (MAL score) and Kitsu (streaming links) in parallel.
4
+ * @module mcp-server/tools/definitions/anime-get-media.tool
5
+ */
6
+ import { tool, z } from '@cyanheads/mcp-ts-core';
7
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
8
+ import * as anilist from '../../../services/anilist/anilist-service.js';
9
+ import * as jikan from '../../../services/jikan/jikan-service.js';
10
+ import * as kitsu from '../../../services/kitsu/kitsu-service.js';
11
+ export const animeGetMedia = tool('anime_get_media', {
12
+ description: 'Full detail for one anime or manga by AniList ID. Returns synopsis, format, episode/chapter count, ' +
13
+ 'status, season, studios, source material, genres and tags (spoiler-flagged), ' +
14
+ 'AniList and MAL scores side by side, streaming links, cover/banner, and direct relations. ' +
15
+ 'Use anime_search_media first to find the AniList ID.',
16
+ annotations: { readOnlyHint: true, idempotentHint: true },
17
+ input: z.object({
18
+ id: z
19
+ .number()
20
+ .int()
21
+ .min(1)
22
+ .describe('AniList media ID. Obtain from anime_search_media results.'),
23
+ include_adult: z
24
+ .boolean()
25
+ .default(false)
26
+ .describe('Include adult/NSFW content. Default false.'),
27
+ }),
28
+ output: z.object({
29
+ id: z.number().int().describe('AniList media ID.'),
30
+ id_mal: z
31
+ .number()
32
+ .int()
33
+ .nullable()
34
+ .describe('MyAnimeList ID used to cross-reference MAL data, or null.'),
35
+ type: z.enum(['ANIME', 'MANGA']).describe('Media type.'),
36
+ title: z
37
+ .object({
38
+ romaji: z.string().nullable().describe('Romanized title.'),
39
+ english: z.string().nullable().describe('English title, or null.'),
40
+ native: z.string().nullable().describe('Native script title, or null.'),
41
+ })
42
+ .describe('Title variants.'),
43
+ format: z.string().nullable().describe('Format: TV, MOVIE, OVA, ONA, MANGA, NOVEL, etc.'),
44
+ status: z.string().nullable().describe('Production status.'),
45
+ season: z.string().nullable().describe('Broadcast season label, e.g. "FALL 2023", or null.'),
46
+ description: z.string().nullable().describe('Plot synopsis (HTML stripped), or null.'),
47
+ source: z
48
+ .string()
49
+ .nullable()
50
+ .describe('Source material type, e.g. "MANGA", "LIGHT_NOVEL", "ORIGINAL".'),
51
+ episodes: z.number().int().nullable().describe('Total episode count (anime), or null.'),
52
+ chapters: z.number().int().nullable().describe('Total chapter count (manga), or null.'),
53
+ volumes: z.number().int().nullable().describe('Total volume count (manga), or null.'),
54
+ genres: z.array(z.string().describe('A genre label.')).describe('Genre list.'),
55
+ tags: z
56
+ .array(z
57
+ .object({
58
+ name: z.string().describe('Tag name.'),
59
+ category: z.string().nullable().describe('Tag category, or null.'),
60
+ rank: z.number().int().nullable().describe('Relevance rank 0–100, or null.'),
61
+ is_spoiler: z
62
+ .boolean()
63
+ .describe('True when AniList marks this tag as a general spoiler.'),
64
+ is_adult: z.boolean().describe('True when this is an adult tag.'),
65
+ })
66
+ .describe('A content tag entry.'))
67
+ .describe('Content tags. Spoiler-flagged tags include is_spoiler: true.'),
68
+ studios: z
69
+ .array(z
70
+ .object({
71
+ id: z.number().int().describe('AniList studio ID.'),
72
+ name: z.string().describe('Studio name.'),
73
+ is_main: z.boolean().describe('True when this is the primary production studio.'),
74
+ is_animation_studio: z.boolean().describe('True when this is an animation studio.'),
75
+ })
76
+ .describe('A studio entry.'))
77
+ .describe('Production studios.'),
78
+ scores: z
79
+ .object({
80
+ anilist_mean: z
81
+ .number()
82
+ .nullable()
83
+ .describe('AniList mean score 0–100, from AniList community votes.'),
84
+ anilist_average: z.number().nullable().describe('AniList weighted average score 0–100.'),
85
+ anilist_popularity: z
86
+ .number()
87
+ .nullable()
88
+ .describe('Number of AniList users with this in their list.'),
89
+ mal_score: z
90
+ .number()
91
+ .nullable()
92
+ .describe('MAL score 0–10.0, from MyAnimeList community. Null when MAL data unavailable.'),
93
+ mal_scored_by: z.number().nullable().describe('Number of MAL users who scored this entry.'),
94
+ mal_rank: z.number().nullable().describe('MAL rank by score, or null.'),
95
+ mal_popularity: z
96
+ .number()
97
+ .nullable()
98
+ .describe('MAL popularity rank (by list count), or null.'),
99
+ })
100
+ .describe('Scores from multiple communities. AniList and MAL use different scales and methodologies — never blend them.'),
101
+ streaming_links: z
102
+ .array(z
103
+ .object({
104
+ site: z.string().describe('Platform name, e.g. "Crunchyroll", "Netflix".'),
105
+ url: z.string().describe('Link to the streaming page.'),
106
+ subs: z
107
+ .array(z.string().describe('A language code or name.'))
108
+ .describe('Subtitle languages available on this platform.'),
109
+ dubs: z
110
+ .array(z.string().describe('A language code or name.'))
111
+ .describe('Dub languages available on this platform.'),
112
+ source: z.enum(['kitsu', 'anilist']).describe('Which service provided this link.'),
113
+ })
114
+ .describe('A streaming platform link entry.'))
115
+ .describe('Streaming platform links (anime only). Empty for manga or when no streaming data is available.'),
116
+ relations: z
117
+ .array(z
118
+ .object({
119
+ relation_type: z
120
+ .string()
121
+ .describe('Relation type: SEQUEL, PREQUEL, SIDE_STORY, SPIN_OFF, ALTERNATIVE, SOURCE, ADAPTATION, etc.'),
122
+ id: z.number().int().describe('AniList ID of the related entry.'),
123
+ title: z.string().nullable().describe('Romanized title of the related entry.'),
124
+ type: z.string().nullable().describe('Media type of the related entry.'),
125
+ format: z.string().nullable().describe('Format of the related entry.'),
126
+ status: z.string().nullable().describe('Status of the related entry.'),
127
+ })
128
+ .describe('A relation entry.'))
129
+ .describe('Direct relations. Use anime_get_relations for full franchise walk-order across multiple hops.'),
130
+ cover_image_url: z.string().nullable().describe('Cover image URL (extra large), or null.'),
131
+ banner_image_url: z.string().nullable().describe('Banner image URL, or null.'),
132
+ site_url: z.string().nullable().describe('AniList page URL.'),
133
+ next_airing: z
134
+ .object({
135
+ episode: z.number().int().describe('Next episode number.'),
136
+ airing_at_utc: z.string().describe('UTC ISO 8601 timestamp of the next airing.'),
137
+ time_until_airing_seconds: z.number().int().describe('Seconds until next airing from now.'),
138
+ })
139
+ .nullable()
140
+ .describe('Next airing episode info for currently airing anime, or null.'),
141
+ is_adult: z.boolean().describe('Whether this entry is marked adult/NSFW.'),
142
+ data_sources: z
143
+ .object({
144
+ anilist: z.boolean().describe('True when AniList data was successfully retrieved.'),
145
+ mal: z.boolean().describe('True when MAL/Jikan data was successfully retrieved.'),
146
+ kitsu: z.boolean().describe('True when Kitsu streaming data was successfully retrieved.'),
147
+ })
148
+ .describe('Provenance: which sources contributed data to this response.'),
149
+ }),
150
+ errors: [
151
+ {
152
+ reason: 'not_found',
153
+ code: JsonRpcErrorCode.NotFound,
154
+ when: 'AniList returns null for the given ID (invalid or nonexistent)',
155
+ recovery: 'Use anime_search_media to find a valid AniList ID and retry.',
156
+ },
157
+ ],
158
+ async handler(input, ctx) {
159
+ ctx.log.info('Fetching media detail', { id: input.id });
160
+ const detail = await anilist.getMediaById(input.id, input.include_adult);
161
+ if (!detail) {
162
+ throw ctx.fail('not_found', `No media found with AniList ID ${input.id}`);
163
+ }
164
+ const mediaType = detail.type;
165
+ // Fan out to Jikan + Kitsu in parallel (supplements only)
166
+ const [jikanResult, kitsuResult] = await Promise.allSettled([
167
+ detail.idMal ? jikan.getMediaFull(detail.idMal, mediaType) : Promise.resolve(null),
168
+ mediaType === 'ANIME' && detail.idMal
169
+ ? kitsu.getAnimeStreamingByMalId(detail.idMal)
170
+ : Promise.resolve(null),
171
+ ]);
172
+ const jikanData = jikanResult.status === 'fulfilled' ? jikanResult.value : null;
173
+ const kitsuData = kitsuResult.status === 'fulfilled' ? kitsuResult.value : null;
174
+ if (jikanResult.status === 'rejected') {
175
+ ctx.log.warning('Jikan supplement failed', {
176
+ id: input.id,
177
+ error: String(jikanResult.reason),
178
+ });
179
+ }
180
+ if (kitsuResult.status === 'rejected') {
181
+ ctx.log.warning('Kitsu supplement failed', {
182
+ id: input.id,
183
+ error: String(kitsuResult.reason),
184
+ });
185
+ }
186
+ // Build streaming links: Kitsu primary, AniList externalLinks fallback
187
+ const streamingLinks = [];
188
+ if (kitsuData?.streamingLinks?.length) {
189
+ for (const link of kitsuData.streamingLinks) {
190
+ // Extract site name from URL
191
+ const site = extractSiteName(link.url);
192
+ streamingLinks.push({
193
+ site,
194
+ url: link.url,
195
+ subs: link.subs,
196
+ dubs: link.dubs,
197
+ source: 'kitsu',
198
+ });
199
+ }
200
+ }
201
+ else if (mediaType === 'ANIME') {
202
+ // Fall back to AniList externalLinks
203
+ for (const link of detail.externalLinks ?? []) {
204
+ if (link.type === 'STREAMING' && link.url) {
205
+ streamingLinks.push({
206
+ site: link.site,
207
+ url: link.url,
208
+ subs: [],
209
+ dubs: [],
210
+ source: 'anilist',
211
+ });
212
+ }
213
+ }
214
+ }
215
+ const season = detail.season && detail.seasonYear
216
+ ? `${detail.season} ${detail.seasonYear}`
217
+ : (detail.season ?? null);
218
+ return {
219
+ id: detail.id,
220
+ id_mal: detail.idMal ?? null,
221
+ type: detail.type,
222
+ title: {
223
+ romaji: detail.title.romaji,
224
+ english: detail.title.english,
225
+ native: detail.title.native,
226
+ },
227
+ format: detail.format ?? null,
228
+ status: detail.status ?? null,
229
+ season,
230
+ description: detail.description ?? null,
231
+ source: detail.source ?? null,
232
+ episodes: detail.episodes ?? null,
233
+ chapters: detail.chapters ?? null,
234
+ volumes: detail.volumes ?? null,
235
+ genres: detail.genres ?? [],
236
+ tags: (detail.tags ?? []).map((t) => ({
237
+ name: t.name,
238
+ category: t.category ?? null,
239
+ rank: t.rank ?? null,
240
+ is_spoiler: t.isGeneralSpoiler,
241
+ is_adult: t.isAdult,
242
+ })),
243
+ studios: (detail.studios?.edges ?? []).map((e) => ({
244
+ id: e.node.id,
245
+ name: e.node.name,
246
+ is_main: e.isMain,
247
+ is_animation_studio: e.node.isAnimationStudio,
248
+ })),
249
+ scores: {
250
+ anilist_mean: detail.meanScore ?? null,
251
+ anilist_average: detail.averageScore ?? null,
252
+ anilist_popularity: detail.popularity ?? null,
253
+ mal_score: jikanData?.score ?? null,
254
+ mal_scored_by: jikanData?.scored_by ?? null,
255
+ mal_rank: jikanData?.rank ?? null,
256
+ mal_popularity: jikanData?.popularity ?? null,
257
+ },
258
+ streaming_links: streamingLinks,
259
+ relations: (detail.relations?.edges ?? []).map((e) => ({
260
+ relation_type: e.relationType,
261
+ id: e.node.id,
262
+ title: e.node.title.romaji,
263
+ type: e.node.type ?? null,
264
+ format: e.node.format ?? null,
265
+ status: e.node.status ?? null,
266
+ })),
267
+ cover_image_url: detail.coverImage?.extraLarge ?? null,
268
+ banner_image_url: detail.bannerImage ?? null,
269
+ site_url: detail.siteUrl ?? null,
270
+ next_airing: detail.nextAiringEpisode
271
+ ? {
272
+ episode: detail.nextAiringEpisode.episode,
273
+ airing_at_utc: new Date(detail.nextAiringEpisode.airingAt * 1000).toISOString(),
274
+ time_until_airing_seconds: detail.nextAiringEpisode.timeUntilAiring,
275
+ }
276
+ : null,
277
+ is_adult: detail.isAdult,
278
+ data_sources: {
279
+ anilist: true,
280
+ mal: jikanData !== null,
281
+ kitsu: kitsuData !== null,
282
+ },
283
+ };
284
+ },
285
+ format: (result) => {
286
+ const title = result.title.english ?? result.title.romaji ?? result.title.native ?? 'Unknown';
287
+ const lines = [];
288
+ lines.push(`## ${title}`);
289
+ if (result.title.romaji && result.title.romaji !== title)
290
+ lines.push(`*${result.title.romaji}*`);
291
+ lines.push('');
292
+ const meta = [];
293
+ if (result.format)
294
+ meta.push(result.format);
295
+ if (result.status)
296
+ meta.push(result.status);
297
+ if (result.season)
298
+ meta.push(result.season);
299
+ if (result.type === 'ANIME' && result.episodes)
300
+ meta.push(`${result.episodes} episodes`);
301
+ if (result.type === 'MANGA' && result.chapters)
302
+ meta.push(`${result.chapters} chapters`);
303
+ if (result.source)
304
+ meta.push(`Source: ${result.source}`);
305
+ if (meta.length)
306
+ lines.push(meta.join(' · '), '');
307
+ if (result.description) {
308
+ lines.push(result.description.slice(0, 500) + (result.description.length > 500 ? '…' : ''), '');
309
+ }
310
+ // Scores
311
+ const scores = [];
312
+ if (result.scores.anilist_mean !== null) {
313
+ scores.push(`AniList: ${result.scores.anilist_mean}/100${result.scores.anilist_popularity !== null ? ` (${result.scores.anilist_popularity.toLocaleString()} users)` : ''}`);
314
+ }
315
+ if (result.scores.mal_score !== null) {
316
+ scores.push(`MAL: ${result.scores.mal_score}/10${result.scores.mal_scored_by !== null ? ` (${result.scores.mal_scored_by.toLocaleString()} users)` : ''}`);
317
+ }
318
+ if (scores.length)
319
+ lines.push(`**Scores:** ${scores.join(' · ')}`, '');
320
+ // Genres + tags (non-spoiler)
321
+ if (result.genres.length)
322
+ lines.push(`**Genres:** ${result.genres.join(', ')}`);
323
+ const visibleTags = result.tags.filter((t) => !t.is_spoiler && !t.is_adult).slice(0, 10);
324
+ if (visibleTags.length)
325
+ lines.push(`**Tags:** ${visibleTags.map((t) => t.name).join(', ')}`);
326
+ const spoilerCount = result.tags.filter((t) => t.is_spoiler).length;
327
+ if (spoilerCount)
328
+ lines.push(`*${spoilerCount} spoiler tag(s) hidden. See tags array.*`);
329
+ if (result.genres.length || visibleTags.length)
330
+ lines.push('');
331
+ // Studios
332
+ if (result.studios.length) {
333
+ const mainStudios = result.studios.filter((s) => s.is_main).map((s) => s.name);
334
+ if (mainStudios.length)
335
+ lines.push(`**Studio(s):** ${mainStudios.join(', ')}`);
336
+ }
337
+ // Streaming links
338
+ if (result.streaming_links.length) {
339
+ lines.push('', `**Streaming:** ${result.streaming_links.map((s) => s.site).join(', ')}`);
340
+ }
341
+ // Relations
342
+ if (result.relations.length) {
343
+ lines.push('', '**Relations:**');
344
+ for (const rel of result.relations.slice(0, 10)) {
345
+ lines.push(`- ${rel.relation_type}: ${rel.title ?? 'Untitled'} [AL:${rel.id}]`);
346
+ }
347
+ }
348
+ // Next airing
349
+ if (result.next_airing) {
350
+ const seconds = result.next_airing.time_until_airing_seconds;
351
+ const hours = Math.floor(seconds / 3600);
352
+ const days = Math.floor(hours / 24);
353
+ const countdown = days > 0 ? `${days}d ${hours % 24}h` : `${hours}h`;
354
+ lines.push('', `**Next airing:** Episode ${result.next_airing.episode} in ${countdown} (${result.next_airing.airing_at_utc})`);
355
+ }
356
+ // IDs and supplementary data
357
+ const idParts = [`AL:${result.id}`];
358
+ if (result.id_mal)
359
+ idParts.push(`MAL:${result.id_mal}`);
360
+ lines.push('', `**IDs:** ${idParts.join(' · ')} | is_adult: ${result.is_adult}`, `**Volumes:** ${result.volumes ?? 'N/A'} | Chapters: ${result.chapters ?? 'N/A'}`, `**Cover:** ${result.cover_image_url ?? 'none'} | Banner: ${result.banner_image_url ?? 'none'}`, `**Title native:** ${result.title.native ?? 'none'} | Site: ${result.site_url ?? 'none'}`);
361
+ // Scores detail (all fields must appear)
362
+ lines.push('', `**Scores detail:** anilist_mean=${result.scores.anilist_mean} anilist_average=${result.scores.anilist_average} anilist_popularity=${result.scores.anilist_popularity} ` +
363
+ `mal_score=${result.scores.mal_score} mal_scored_by=${result.scores.mal_scored_by} mal_rank=${result.scores.mal_rank} mal_popularity=${result.scores.mal_popularity}`, `**Data sources:** anilist=${result.data_sources.anilist} mal=${result.data_sources.mal} kitsu=${result.data_sources.kitsu}`);
364
+ // Tags full (for parity — include category, rank, is_adult)
365
+ if (result.tags.length) {
366
+ const tagDetail = result.tags
367
+ .slice(0, 5)
368
+ .map((t) => `${t.name}(cat:${t.category ?? '?'} rank:${t.rank ?? '?'} spoiler:${t.is_spoiler} is_adult:${t.is_adult})`)
369
+ .join(', ');
370
+ lines.push(`**Tag detail:** ${tagDetail}`);
371
+ }
372
+ // Studios detail (id, is_animation_studio)
373
+ if (result.studios.length) {
374
+ const studioDetail = result.studios
375
+ .map((s) => `${s.name}[id:${s.id} main:${s.is_main} anim:${s.is_animation_studio}]`)
376
+ .join(', ');
377
+ lines.push(`**Studio detail:** ${studioDetail}`);
378
+ }
379
+ // Streaming detail (url, subs, dubs, source)
380
+ if (result.streaming_links.length) {
381
+ const streamDetail = result.streaming_links
382
+ .map((s) => `${s.site}(url:${s.url} subs:${s.subs.join(',')} dubs:${s.dubs.join(',')} src:${s.source})`)
383
+ .join(' | ');
384
+ lines.push(`**Stream detail:** ${streamDetail}`);
385
+ }
386
+ // Relations detail (type, format, status)
387
+ if (result.relations.length) {
388
+ const relDetail = result.relations
389
+ .slice(0, 5)
390
+ .map((r) => `${r.relation_type}:${r.title ?? '?'}[type:${r.type} fmt:${r.format} status:${r.status}]`)
391
+ .join(', ');
392
+ lines.push(`**Relation detail:** ${relDetail}`);
393
+ }
394
+ // Next airing all fields
395
+ if (result.next_airing) {
396
+ lines.push(`**Next airing full:** episode=${result.next_airing.episode} airing_at_utc=${result.next_airing.airing_at_utc} time_until_airing_seconds=${result.next_airing.time_until_airing_seconds}`);
397
+ }
398
+ return [{ type: 'text', text: lines.join('\n') }];
399
+ },
400
+ });
401
+ /** Extract a human-readable site name from a URL. */
402
+ function extractSiteName(url) {
403
+ try {
404
+ const hostname = new URL(url).hostname.replace(/^www\./, '');
405
+ const known = {
406
+ 'crunchyroll.com': 'Crunchyroll',
407
+ 'funimation.com': 'Funimation',
408
+ 'netflix.com': 'Netflix',
409
+ 'hidive.com': 'HIDIVE',
410
+ 'hulu.com': 'Hulu',
411
+ 'amazon.com': 'Amazon Prime',
412
+ 'primevideo.com': 'Amazon Prime',
413
+ 'vrv.co': 'VRV',
414
+ 'youtube.com': 'YouTube',
415
+ 'wakanim.tv': 'Wakanim',
416
+ 'bilibili.com': 'Bilibili',
417
+ 'animelab.com': 'AnimeLab',
418
+ };
419
+ return known[hostname] ?? hostname;
420
+ }
421
+ catch {
422
+ return url;
423
+ }
424
+ }
425
+ //# sourceMappingURL=anime-get-media.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anime-get-media.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/anime-get-media.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
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 { z } from '@cyanheads/mcp-ts-core';
6
+ export declare const animeGetRankings: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
7
+ mode: z.ZodEnum<{
8
+ top: "top";
9
+ trending: "trending";
10
+ seasonal: "seasonal";
11
+ }>;
12
+ media_type: z.ZodEnum<{
13
+ ANIME: "ANIME";
14
+ MANGA: "MANGA";
15
+ }>;
16
+ format: z.ZodOptional<z.ZodEnum<{
17
+ MANGA: "MANGA";
18
+ TV: "TV";
19
+ TV_SHORT: "TV_SHORT";
20
+ MOVIE: "MOVIE";
21
+ SPECIAL: "SPECIAL";
22
+ OVA: "OVA";
23
+ ONA: "ONA";
24
+ MUSIC: "MUSIC";
25
+ NOVEL: "NOVEL";
26
+ ONE_SHOT: "ONE_SHOT";
27
+ }>>;
28
+ genre: z.ZodOptional<z.ZodString>;
29
+ season: z.ZodOptional<z.ZodEnum<{
30
+ WINTER: "WINTER";
31
+ SPRING: "SPRING";
32
+ SUMMER: "SUMMER";
33
+ FALL: "FALL";
34
+ }>>;
35
+ season_year: z.ZodOptional<z.ZodNumber>;
36
+ page: z.ZodDefault<z.ZodNumber>;
37
+ per_page: z.ZodDefault<z.ZodNumber>;
38
+ include_adult: z.ZodDefault<z.ZodBoolean>;
39
+ }, z.core.$strip>, z.ZodObject<{
40
+ mode: z.ZodEnum<{
41
+ top: "top";
42
+ trending: "trending";
43
+ seasonal: "seasonal";
44
+ }>;
45
+ media_type: z.ZodEnum<{
46
+ ANIME: "ANIME";
47
+ MANGA: "MANGA";
48
+ }>;
49
+ season_label: z.ZodNullable<z.ZodString>;
50
+ page: z.ZodNumber;
51
+ has_next_page: z.ZodBoolean;
52
+ total_results: z.ZodNullable<z.ZodNumber>;
53
+ entries: z.ZodArray<z.ZodObject<{
54
+ rank: z.ZodNumber;
55
+ id: z.ZodNumber;
56
+ id_mal: z.ZodNullable<z.ZodNumber>;
57
+ title: z.ZodNullable<z.ZodString>;
58
+ title_english: z.ZodNullable<z.ZodString>;
59
+ type: z.ZodEnum<{
60
+ ANIME: "ANIME";
61
+ MANGA: "MANGA";
62
+ }>;
63
+ format: z.ZodNullable<z.ZodString>;
64
+ status: z.ZodNullable<z.ZodString>;
65
+ season: z.ZodNullable<z.ZodString>;
66
+ episodes: z.ZodNullable<z.ZodNumber>;
67
+ chapters: z.ZodNullable<z.ZodNumber>;
68
+ mean_score: z.ZodNullable<z.ZodNumber>;
69
+ is_adult: z.ZodBoolean;
70
+ cover_image_url: z.ZodNullable<z.ZodString>;
71
+ }, z.core.$strip>>;
72
+ }, z.core.$strip>, undefined, undefined>;
73
+ //# sourceMappingURL=anime-get-rankings.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anime-get-rankings.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/anime-get-rankings.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAYjD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wCAmK3B,CAAC"}