@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,163 @@
1
+ /**
2
+ * @fileoverview anime_get_studio tool — studio filmography by name or AniList studio ID.
3
+ * @module mcp-server/tools/definitions/anime-get-studio.tool
4
+ */
5
+ import { tool, z } from '@cyanheads/mcp-ts-core';
6
+ import { JsonRpcErrorCode, validationError } from '@cyanheads/mcp-ts-core/errors';
7
+ import * as anilist from '../../../services/anilist/anilist-service.js';
8
+ export const animeGetStudio = tool('anime_get_studio', {
9
+ description: "A studio's full filmography by name or AniList studio ID. " +
10
+ 'Returns all titles the studio produced, sortable by year or score, ' +
11
+ 'with format, status, and episode count. ' +
12
+ 'Provide "name" for a name-based search, or "id" for direct lookup by AniList studio ID.',
13
+ annotations: { readOnlyHint: true, openWorldHint: true },
14
+ input: z.object({
15
+ name: z
16
+ .string()
17
+ .max(200)
18
+ .optional()
19
+ .describe('Studio name to search for, e.g. "MAPPA", "Kyoto Animation", "ufotable".'),
20
+ id: z
21
+ .number()
22
+ .int()
23
+ .min(1)
24
+ .optional()
25
+ .describe('AniList studio ID for direct lookup. More precise than name search.'),
26
+ sort: z
27
+ .enum(['POPULARITY_DESC', 'SCORE_DESC', 'START_DATE_DESC', 'START_DATE'])
28
+ .default('POPULARITY_DESC')
29
+ .describe('Sort order for the filmography. ' +
30
+ 'POPULARITY_DESC: most popular first (default). ' +
31
+ 'SCORE_DESC: highest-scored first. ' +
32
+ 'START_DATE_DESC: newest first. ' +
33
+ 'START_DATE: oldest first (release chronology).'),
34
+ page: z.number().int().min(1).default(1).describe('1-based page number.'),
35
+ per_page: z.number().int().min(1).max(50).default(25).describe('Results per page. Maximum 50.'),
36
+ }),
37
+ output: z.object({
38
+ studio_id: z.number().int().describe('AniList studio ID.'),
39
+ studio_name: z.string().describe('Studio name.'),
40
+ is_animation_studio: z
41
+ .boolean()
42
+ .describe('True when this is classified as an animation studio.'),
43
+ studio_site_url: z.string().nullable().describe('AniList studio page URL, or null.'),
44
+ page: z.number().int().describe('Current page number.'),
45
+ has_next_page: z.boolean().describe('Whether more pages are available.'),
46
+ total_titles: z.number().int().nullable().describe('Total titles in filmography, or null.'),
47
+ filmography: z
48
+ .array(z
49
+ .object({
50
+ id: z.number().int().describe('AniList media ID.'),
51
+ id_mal: z.number().int().nullable().describe('MyAnimeList ID, or null.'),
52
+ title: z.string().nullable().describe('Romanized title.'),
53
+ title_english: z.string().nullable().describe('English title, or null.'),
54
+ type: z.enum(['ANIME', 'MANGA']).describe('Media type.'),
55
+ format: z.string().nullable().describe('Format: TV, MOVIE, OVA, etc.'),
56
+ status: z.string().nullable().describe('Production status.'),
57
+ season: z
58
+ .string()
59
+ .nullable()
60
+ .describe('Broadcast season label, e.g. "FALL 2023", or null.'),
61
+ season_year: z.number().int().nullable().describe('Season year, or null.'),
62
+ episodes: z.number().int().nullable().describe('Episode count, or null.'),
63
+ mean_score: z.number().nullable().describe('AniList mean score 0–100, or null.'),
64
+ is_adult: z.boolean().describe('Whether marked adult/NSFW.'),
65
+ cover_image_url: z.string().nullable().describe('Cover image URL, or null.'),
66
+ })
67
+ .describe('A filmography entry.'))
68
+ .describe('Studio filmography entries.'),
69
+ }),
70
+ errors: [
71
+ {
72
+ reason: 'not_found',
73
+ code: JsonRpcErrorCode.NotFound,
74
+ when: 'Neither name search nor ID lookup returns a result on AniList',
75
+ recovery: 'Check the studio name spelling (e.g. "Kyoto Animation" not "KyoAni") or use the correct AniList studio ID.',
76
+ },
77
+ ],
78
+ async handler(input, ctx) {
79
+ if (!input.name && !input.id) {
80
+ throw validationError('Provide either name or id to look up a studio');
81
+ }
82
+ let studio;
83
+ if (input.id) {
84
+ ctx.log.info('Fetching studio by ID', { id: input.id });
85
+ studio = await anilist.getStudioById({
86
+ id: input.id,
87
+ sort: input.sort,
88
+ page: input.page,
89
+ perPage: input.per_page,
90
+ });
91
+ }
92
+ else {
93
+ ctx.log.info('Searching studio by name', { name: input.name });
94
+ studio = await anilist.searchStudio({
95
+ name: input.name ?? '',
96
+ sort: input.sort,
97
+ page: input.page,
98
+ perPage: input.per_page,
99
+ });
100
+ }
101
+ if (!studio) {
102
+ throw ctx.fail('not_found', input.id
103
+ ? `No studio found with AniList ID ${input.id}`
104
+ : `No studio found matching "${input.name}"`);
105
+ }
106
+ return {
107
+ studio_id: studio.id,
108
+ studio_name: studio.name,
109
+ is_animation_studio: studio.isAnimationStudio,
110
+ studio_site_url: studio.siteUrl ?? null,
111
+ page: studio.media.pageInfo.currentPage,
112
+ has_next_page: studio.media.pageInfo.hasNextPage,
113
+ total_titles: studio.media.pageInfo.total ?? null,
114
+ filmography: studio.media.nodes.map((m) => ({
115
+ id: m.id,
116
+ id_mal: m.idMal ?? null,
117
+ title: m.title.romaji,
118
+ title_english: m.title.english,
119
+ type: m.type,
120
+ format: m.format ?? null,
121
+ status: m.status ?? null,
122
+ season: m.season && m.seasonYear ? `${m.season} ${m.seasonYear}` : (m.season ?? null),
123
+ season_year: m.seasonYear ?? null,
124
+ episodes: m.episodes ?? null,
125
+ mean_score: m.meanScore ?? null,
126
+ is_adult: m.isAdult,
127
+ cover_image_url: m.coverImage?.large ?? null,
128
+ })),
129
+ };
130
+ },
131
+ format: (result) => {
132
+ const lines = [
133
+ `## ${result.studio_name} Filmography`,
134
+ `AniList ID: ${result.studio_id}${result.is_animation_studio ? ' · Animation Studio' : ''} | studio_site_url: ${result.studio_site_url ?? 'none'}`,
135
+ `${result.total_titles !== null ? `${result.total_titles} titles` : 'Titles'} · page ${result.page}`,
136
+ '',
137
+ ];
138
+ if (result.filmography.length === 0) {
139
+ lines.push('No titles found.');
140
+ return [{ type: 'text', text: lines.join('\n') }];
141
+ }
142
+ for (const m of result.filmography) {
143
+ const displayTitle = m.title_english ?? m.title ?? 'Unknown';
144
+ const score = m.mean_score !== null ? ` · ${m.mean_score}/100` : '';
145
+ const fmt = m.format ? ` · ${m.format}` : '';
146
+ const ep = m.episodes !== null ? ` · ${m.episodes} eps` : '';
147
+ const season = m.season ? ` · ${m.season}` : '';
148
+ const adult = m.is_adult ? ' · [Adult]' : '';
149
+ const malId = m.id_mal !== null ? `/MAL:${m.id_mal}` : '';
150
+ const typeLabel = ` type:${m.type}`;
151
+ const status = m.status ? ` status:${m.status}` : '';
152
+ const seasonYear = m.season_year !== null ? ` season_year:${m.season_year}` : '';
153
+ const cover = m.cover_image_url ? ` cover:${m.cover_image_url}` : '';
154
+ const titleRomaji = m.title ? ` title:${m.title}` : '';
155
+ lines.push(`**${displayTitle}** [AL:${m.id}${malId}]${typeLabel}${fmt}${status}${season}${seasonYear}${ep}${score}${adult}${titleRomaji}${cover}`);
156
+ }
157
+ if (result.has_next_page) {
158
+ lines.push('', `_More titles available (page ${result.page + 1})._`);
159
+ }
160
+ return [{ type: 'text', text: lines.join('\n') }];
161
+ },
162
+ });
163
+ //# sourceMappingURL=anime-get-studio.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anime-get-studio.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/anime-get-studio.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * @fileoverview anime_search_media tool — search anime or manga by title, genre, tag, season, etc.
3
+ * AniList primary; Jikan fallback on empty results.
4
+ * @module mcp-server/tools/definitions/anime-search-media.tool
5
+ */
6
+ import { z } from '@cyanheads/mcp-ts-core';
7
+ export declare const animeSearchMedia: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
8
+ media_type: z.ZodEnum<{
9
+ ANIME: "ANIME";
10
+ MANGA: "MANGA";
11
+ }>;
12
+ query: z.ZodOptional<z.ZodString>;
13
+ genre: z.ZodOptional<z.ZodString>;
14
+ tag: z.ZodOptional<z.ZodString>;
15
+ season: z.ZodOptional<z.ZodEnum<{
16
+ WINTER: "WINTER";
17
+ SPRING: "SPRING";
18
+ SUMMER: "SUMMER";
19
+ FALL: "FALL";
20
+ }>>;
21
+ season_year: z.ZodOptional<z.ZodNumber>;
22
+ format: z.ZodOptional<z.ZodEnum<{
23
+ MANGA: "MANGA";
24
+ TV: "TV";
25
+ TV_SHORT: "TV_SHORT";
26
+ MOVIE: "MOVIE";
27
+ SPECIAL: "SPECIAL";
28
+ OVA: "OVA";
29
+ ONA: "ONA";
30
+ MUSIC: "MUSIC";
31
+ NOVEL: "NOVEL";
32
+ ONE_SHOT: "ONE_SHOT";
33
+ }>>;
34
+ status: z.ZodOptional<z.ZodEnum<{
35
+ FINISHED: "FINISHED";
36
+ RELEASING: "RELEASING";
37
+ NOT_YET_RELEASED: "NOT_YET_RELEASED";
38
+ CANCELLED: "CANCELLED";
39
+ HIATUS: "HIATUS";
40
+ }>>;
41
+ sort: z.ZodOptional<z.ZodArray<z.ZodString>>;
42
+ page: z.ZodDefault<z.ZodNumber>;
43
+ per_page: z.ZodDefault<z.ZodNumber>;
44
+ include_adult: z.ZodDefault<z.ZodBoolean>;
45
+ }, z.core.$strip>, z.ZodObject<{
46
+ source: z.ZodEnum<{
47
+ anilist: "anilist";
48
+ jikan: "jikan";
49
+ }>;
50
+ page: z.ZodNumber;
51
+ has_next_page: z.ZodBoolean;
52
+ total_results: z.ZodNullable<z.ZodNumber>;
53
+ results: z.ZodArray<z.ZodObject<{
54
+ id: z.ZodNumber;
55
+ id_mal: z.ZodNullable<z.ZodNumber>;
56
+ title_romaji: z.ZodNullable<z.ZodString>;
57
+ title_english: z.ZodNullable<z.ZodString>;
58
+ title_native: 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-search-media.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anime-search-media.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/anime-search-media.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAiBjD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wCA4O3B,CAAC"}
@@ -0,0 +1,229 @@
1
+ /**
2
+ * @fileoverview anime_search_media tool — search anime or manga by title, genre, tag, season, etc.
3
+ * AniList primary; Jikan fallback on empty results.
4
+ * @module mcp-server/tools/definitions/anime-search-media.tool
5
+ */
6
+ import { tool, z } from '@cyanheads/mcp-ts-core';
7
+ import * as anilist from '../../../services/anilist/anilist-service.js';
8
+ import * as jikan from '../../../services/jikan/jikan-service.js';
9
+ const MediaTypeEnum = z.enum(['ANIME', 'MANGA']).describe('Media type to search: anime or manga.');
10
+ const SeasonEnum = z
11
+ .enum(['WINTER', 'SPRING', 'SUMMER', 'FALL'])
12
+ .describe('Anime broadcast season. WINTER=Jan–Mar, SPRING=Apr–Jun, SUMMER=Jul–Sep, FALL=Oct–Dec.');
13
+ const FormatEnum = z
14
+ .enum(['TV', 'TV_SHORT', 'MOVIE', 'SPECIAL', 'OVA', 'ONA', 'MUSIC', 'MANGA', 'NOVEL', 'ONE_SHOT'])
15
+ .describe('Publication/broadcast format filter.');
16
+ const StatusEnum = z
17
+ .enum(['FINISHED', 'RELEASING', 'NOT_YET_RELEASED', 'CANCELLED', 'HIATUS'])
18
+ .describe('Production status filter.');
19
+ export const animeSearchMedia = tool('anime_search_media', {
20
+ description: 'Search anime or manga by title, genre, tag, season, year, format, or status. ' +
21
+ 'Returns ranked results with AniList IDs, titles, scores, format, and episode/chapter counts. ' +
22
+ 'AniList is the primary source; Jikan (MAL) is used as a fallback when AniList returns no results.',
23
+ annotations: { readOnlyHint: true, openWorldHint: true },
24
+ input: z.object({
25
+ media_type: MediaTypeEnum,
26
+ query: z.string().max(200).optional().describe('Title search query. Supports partial matches.'),
27
+ genre: z
28
+ .string()
29
+ .max(100)
30
+ .optional()
31
+ .describe('Genre filter, e.g. "Action", "Romance", "Slice of Life".'),
32
+ tag: z
33
+ .string()
34
+ .max(100)
35
+ .optional()
36
+ .describe('Tag filter, e.g. "Isekai", "Mecha", "School Life".'),
37
+ season: SeasonEnum.optional(),
38
+ season_year: z
39
+ .number()
40
+ .int()
41
+ .min(1940)
42
+ .max(2100)
43
+ .optional()
44
+ .describe('4-digit year for the broadcast season, e.g. 2024. Required when season is set.'),
45
+ format: FormatEnum.optional(),
46
+ status: StatusEnum.optional(),
47
+ sort: z
48
+ .array(z.string().max(50).describe('A sort field string, e.g. "SCORE_DESC" or "POPULARITY_DESC".'))
49
+ .max(5)
50
+ .optional()
51
+ .describe('Sort order list. Common values: SEARCH_MATCH (default), SCORE_DESC, POPULARITY_DESC, TRENDING_DESC, START_DATE_DESC.'),
52
+ page: z.number().int().min(1).default(1).describe('1-based page number for paginated results.'),
53
+ per_page: z.number().int().min(1).max(50).default(20).describe('Results per page. Maximum 50.'),
54
+ include_adult: z
55
+ .boolean()
56
+ .default(false)
57
+ .describe('Include adult/NSFW content. Default false.'),
58
+ }),
59
+ output: z.object({
60
+ source: z
61
+ .enum(['anilist', 'jikan'])
62
+ .describe('Which API provided these results: "anilist" (primary) or "jikan" (fallback).'),
63
+ page: z.number().int().describe('Current page number.'),
64
+ has_next_page: z.boolean().describe('Whether more pages are available.'),
65
+ total_results: z
66
+ .number()
67
+ .int()
68
+ .nullable()
69
+ .describe('Total matching results, or null when unknown.'),
70
+ results: z
71
+ .array(z
72
+ .object({
73
+ id: z
74
+ .number()
75
+ .int()
76
+ .describe('AniList media ID. Use with anime_get_media for full detail.'),
77
+ id_mal: z.number().int().nullable().describe('MyAnimeList ID, or null if unavailable.'),
78
+ title_romaji: z.string().nullable().describe('Romanized title.'),
79
+ title_english: z.string().nullable().describe('English title, or null.'),
80
+ title_native: z
81
+ .string()
82
+ .nullable()
83
+ .describe('Native script title (Japanese, Korean, etc.), or null.'),
84
+ type: z.enum(['ANIME', 'MANGA']).describe('Media type.'),
85
+ format: z
86
+ .string()
87
+ .nullable()
88
+ .describe('Format: TV, MOVIE, OVA, ONA, MANGA, NOVEL, etc.'),
89
+ status: z.string().nullable().describe('Production status.'),
90
+ season: z.string().nullable().describe('Broadcast season label, e.g. "FALL 2023".'),
91
+ episodes: z.number().int().nullable().describe('Episode count (anime), or null.'),
92
+ chapters: z.number().int().nullable().describe('Chapter count (manga), or null.'),
93
+ mean_score: z
94
+ .number()
95
+ .nullable()
96
+ .describe('AniList mean score 0–100, or null. Use anime_get_media for MAL score too.'),
97
+ is_adult: z.boolean().describe('Whether this entry is marked adult/NSFW.'),
98
+ cover_image_url: z.string().nullable().describe('Cover image URL (large), or null.'),
99
+ })
100
+ .describe('A matching media entry.'))
101
+ .describe('Matching media entries.'),
102
+ }),
103
+ async handler(input, ctx) {
104
+ ctx.log.info('Searching anime/manga', {
105
+ mediaType: input.media_type,
106
+ query: input.query,
107
+ genre: input.genre,
108
+ tag: input.tag,
109
+ season: input.season,
110
+ });
111
+ const page = await anilist.searchMedia({
112
+ mediaType: input.media_type,
113
+ query: input.query,
114
+ genre: input.genre,
115
+ tag: input.tag,
116
+ season: input.season,
117
+ seasonYear: input.season_year,
118
+ format: input.format,
119
+ status: input.status,
120
+ sort: input.sort,
121
+ page: input.page,
122
+ perPage: input.per_page,
123
+ includeAdult: input.include_adult,
124
+ });
125
+ // AniList returned results
126
+ if (page.media.length > 0) {
127
+ return {
128
+ source: 'anilist',
129
+ page: page.pageInfo.currentPage,
130
+ has_next_page: page.pageInfo.hasNextPage,
131
+ total_results: page.pageInfo.total ?? null,
132
+ results: page.media.map((m) => ({
133
+ id: m.id,
134
+ id_mal: m.idMal ?? null,
135
+ title_romaji: m.title.romaji,
136
+ title_english: m.title.english,
137
+ title_native: m.title.native,
138
+ type: m.type,
139
+ format: m.format ?? null,
140
+ status: m.status ?? null,
141
+ season: m.season && m.seasonYear ? `${m.season} ${m.seasonYear}` : (m.season ?? null),
142
+ episodes: m.episodes ?? null,
143
+ chapters: m.chapters ?? null,
144
+ mean_score: m.meanScore ?? null,
145
+ is_adult: m.isAdult,
146
+ cover_image_url: m.coverImage?.large ?? null,
147
+ })),
148
+ };
149
+ }
150
+ // Fallback to Jikan when AniList returns nothing and there's a text query
151
+ if (input.query) {
152
+ ctx.log.info('AniList returned no results, trying Jikan fallback', { query: input.query });
153
+ const jikanResult = await jikan.searchMedia({
154
+ query: input.query,
155
+ mediaType: input.media_type,
156
+ page: input.page,
157
+ limit: input.per_page,
158
+ });
159
+ return {
160
+ source: 'jikan',
161
+ page: jikanResult.pagination?.current_page ?? input.page,
162
+ has_next_page: jikanResult.pagination?.has_next_page ?? false,
163
+ total_results: jikanResult.pagination?.items.total ?? null,
164
+ results: jikanResult.results.map((r) => ({
165
+ id: 0, // Jikan doesn't provide AniList IDs
166
+ id_mal: r.mal_id,
167
+ title_romaji: r.title,
168
+ title_english: r.title_english,
169
+ title_native: null,
170
+ type: input.media_type,
171
+ format: r.type ?? null,
172
+ status: r.status ?? null,
173
+ season: null,
174
+ episodes: r.episodes ?? null,
175
+ chapters: r.chapters ?? null,
176
+ mean_score: r.score ? Math.round(r.score * 10) : null,
177
+ is_adult: false,
178
+ cover_image_url: null,
179
+ })),
180
+ };
181
+ }
182
+ // No results from either source
183
+ return {
184
+ source: 'anilist',
185
+ page: input.page,
186
+ has_next_page: false,
187
+ total_results: 0,
188
+ results: [],
189
+ };
190
+ },
191
+ format: (result) => {
192
+ if (result.results.length === 0) {
193
+ return [{ type: 'text', text: `No results found (source: ${result.source}).` }];
194
+ }
195
+ const lines = [
196
+ `**Search Results** (source: ${result.source}, page ${result.page}${result.total_results !== null ? `, ${result.total_results} total` : ''})`,
197
+ '',
198
+ ];
199
+ for (const r of result.results) {
200
+ const title = r.title_english ?? r.title_romaji ?? r.title_native ?? 'Unknown';
201
+ const score = r.mean_score !== null ? ` · Score: ${r.mean_score}/100` : '';
202
+ const fmt = r.format ? ` · ${r.format}` : '';
203
+ const status = r.status ? ` · ${r.status}` : '';
204
+ const ep = r.type === 'ANIME' && r.episodes !== null
205
+ ? ` · ${r.episodes} eps`
206
+ : r.type === 'MANGA' && r.chapters !== null
207
+ ? ` · ${r.chapters} ch`
208
+ : '';
209
+ const season = r.season ? ` · ${r.season}` : '';
210
+ const adult = r.is_adult ? ' · [Adult]' : '';
211
+ const ids = r.id > 0
212
+ ? `[AL:${r.id}${r.id_mal !== null ? `/MAL:${r.id_mal}` : ''}]`
213
+ : r.id_mal !== null
214
+ ? `[MAL:${r.id_mal}]`
215
+ : '';
216
+ const native = r.title_native ? ` (${r.title_native})` : '';
217
+ const img = r.cover_image_url ? ` | cover_image_url: ${r.cover_image_url}` : '';
218
+ const chap = r.chapters !== null ? ` chapters:${r.chapters}` : '';
219
+ const typeLabel = ` type:${r.type}`;
220
+ const romaji = r.title_romaji ? ` title_romaji:${r.title_romaji}` : '';
221
+ lines.push(`**${title}**${native} ${ids}${fmt}${status}${score}${ep}${chap}${season}${adult}${typeLabel}${romaji}${img}`);
222
+ }
223
+ if (result.has_next_page) {
224
+ lines.push('', `_More results available (page ${result.page + 1})._`);
225
+ }
226
+ return [{ type: 'text', text: lines.join('\n') }];
227
+ },
228
+ });
229
+ //# sourceMappingURL=anime-search-media.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anime-search-media.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/anime-search-media.tool.ts"],"names":[],"mappings":"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"}