@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,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview AniList service types — normalized domain types for the AniList GraphQL API.
|
|
3
|
+
* @module services/anilist/types
|
|
4
|
+
*/
|
|
5
|
+
/** Media type selector. */
|
|
6
|
+
export type MediaType = 'ANIME' | 'MANGA';
|
|
7
|
+
/** AniList season enum. */
|
|
8
|
+
export type MediaSeason = 'WINTER' | 'SPRING' | 'SUMMER' | 'FALL';
|
|
9
|
+
/** AniList format enum. */
|
|
10
|
+
export type MediaFormat = 'TV' | 'TV_SHORT' | 'MOVIE' | 'SPECIAL' | 'OVA' | 'ONA' | 'MUSIC' | 'MANGA' | 'NOVEL' | 'ONE_SHOT';
|
|
11
|
+
/** AniList status enum. */
|
|
12
|
+
export type MediaStatus = 'FINISHED' | 'RELEASING' | 'NOT_YET_RELEASED' | 'CANCELLED' | 'HIATUS';
|
|
13
|
+
/** AniList staff language enum. */
|
|
14
|
+
export type StaffLanguage = 'JAPANESE' | 'ENGLISH' | 'KOREAN' | 'ITALIAN' | 'SPANISH' | 'PORTUGUESE' | 'FRENCH' | 'GERMAN' | 'HEBREW' | 'HUNGARIAN';
|
|
15
|
+
/** Relation type between media entries. */
|
|
16
|
+
export type MediaRelationType = 'ADAPTATION' | 'PREQUEL' | 'SEQUEL' | 'PARENT' | 'SIDE_STORY' | 'CHARACTER' | 'SUMMARY' | 'ALTERNATIVE' | 'SPIN_OFF' | 'OTHER' | 'SOURCE' | 'COMPILATION' | 'CONTAINS';
|
|
17
|
+
/** Character role. */
|
|
18
|
+
export type CharacterRole = 'MAIN' | 'SUPPORTING' | 'BACKGROUND';
|
|
19
|
+
/** A title's localized name variants. */
|
|
20
|
+
export interface MediaTitle {
|
|
21
|
+
english: string | null;
|
|
22
|
+
native: string | null;
|
|
23
|
+
romaji: string | null;
|
|
24
|
+
}
|
|
25
|
+
/** Cover image URLs. */
|
|
26
|
+
export interface CoverImage {
|
|
27
|
+
color: string | null;
|
|
28
|
+
extraLarge: string | null;
|
|
29
|
+
large: string | null;
|
|
30
|
+
medium: string | null;
|
|
31
|
+
}
|
|
32
|
+
/** A single tag. */
|
|
33
|
+
export interface MediaTag {
|
|
34
|
+
category: string | null;
|
|
35
|
+
description: string | null;
|
|
36
|
+
id: number;
|
|
37
|
+
isAdult: boolean;
|
|
38
|
+
isGeneralSpoiler: boolean;
|
|
39
|
+
name: string;
|
|
40
|
+
rank: number | null;
|
|
41
|
+
}
|
|
42
|
+
/** A single studio edge. */
|
|
43
|
+
export interface StudioEdge {
|
|
44
|
+
isMain: boolean;
|
|
45
|
+
node: {
|
|
46
|
+
id: number;
|
|
47
|
+
name: string;
|
|
48
|
+
isAnimationStudio: boolean;
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** An external link (streaming or info). */
|
|
52
|
+
export interface ExternalLink {
|
|
53
|
+
color: string | null;
|
|
54
|
+
icon: string | null;
|
|
55
|
+
id: number;
|
|
56
|
+
isDisabled: boolean;
|
|
57
|
+
language: string | null;
|
|
58
|
+
site: string;
|
|
59
|
+
siteId: number | null;
|
|
60
|
+
type: string | null;
|
|
61
|
+
url: string | null;
|
|
62
|
+
}
|
|
63
|
+
/** A relation edge pointing to another media entry. */
|
|
64
|
+
export interface MediaRelationEdge {
|
|
65
|
+
node: MediaNode;
|
|
66
|
+
relationType: MediaRelationType;
|
|
67
|
+
}
|
|
68
|
+
/** A lightweight media node used in relation graphs and recommendations. */
|
|
69
|
+
export interface MediaNode {
|
|
70
|
+
chapters: number | null;
|
|
71
|
+
coverImage: CoverImage | null;
|
|
72
|
+
episodes: number | null;
|
|
73
|
+
format: MediaFormat | null;
|
|
74
|
+
id: number;
|
|
75
|
+
idMal: number | null;
|
|
76
|
+
isAdult: boolean;
|
|
77
|
+
meanScore: number | null;
|
|
78
|
+
season: MediaSeason | null;
|
|
79
|
+
seasonYear: number | null;
|
|
80
|
+
status: MediaStatus | null;
|
|
81
|
+
title: MediaTitle;
|
|
82
|
+
type: MediaType;
|
|
83
|
+
volumes: number | null;
|
|
84
|
+
}
|
|
85
|
+
/** Full media detail from AniList. */
|
|
86
|
+
export interface MediaDetail extends MediaNode {
|
|
87
|
+
averageScore: number | null;
|
|
88
|
+
bannerImage: string | null;
|
|
89
|
+
description: string | null;
|
|
90
|
+
endDate: {
|
|
91
|
+
year: number | null;
|
|
92
|
+
month: number | null;
|
|
93
|
+
day: number | null;
|
|
94
|
+
} | null;
|
|
95
|
+
externalLinks: ExternalLink[];
|
|
96
|
+
favourites: number | null;
|
|
97
|
+
genres: string[];
|
|
98
|
+
hashtag: string | null;
|
|
99
|
+
isAdult: boolean;
|
|
100
|
+
isFavourite: boolean;
|
|
101
|
+
nextAiringEpisode: {
|
|
102
|
+
airingAt: number;
|
|
103
|
+
episode: number;
|
|
104
|
+
timeUntilAiring: number;
|
|
105
|
+
} | null;
|
|
106
|
+
popularity: number | null;
|
|
107
|
+
relations: {
|
|
108
|
+
edges: MediaRelationEdge[];
|
|
109
|
+
};
|
|
110
|
+
siteUrl: string | null;
|
|
111
|
+
source: string | null;
|
|
112
|
+
startDate: {
|
|
113
|
+
year: number | null;
|
|
114
|
+
month: number | null;
|
|
115
|
+
day: number | null;
|
|
116
|
+
} | null;
|
|
117
|
+
studios: {
|
|
118
|
+
edges: StudioEdge[];
|
|
119
|
+
};
|
|
120
|
+
tags: MediaTag[];
|
|
121
|
+
trailer: {
|
|
122
|
+
id: string;
|
|
123
|
+
site: string;
|
|
124
|
+
} | null;
|
|
125
|
+
}
|
|
126
|
+
/** A page of media search results. */
|
|
127
|
+
export interface MediaPage {
|
|
128
|
+
media: MediaNode[];
|
|
129
|
+
pageInfo: {
|
|
130
|
+
total: number | null;
|
|
131
|
+
currentPage: number;
|
|
132
|
+
lastPage: number | null;
|
|
133
|
+
hasNextPage: boolean;
|
|
134
|
+
perPage: number | null;
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/** A character with optional voice actor edges. */
|
|
138
|
+
export interface CharacterEdge {
|
|
139
|
+
node: {
|
|
140
|
+
id: number;
|
|
141
|
+
name: {
|
|
142
|
+
full: string | null;
|
|
143
|
+
native: string | null;
|
|
144
|
+
};
|
|
145
|
+
image: {
|
|
146
|
+
large: string | null;
|
|
147
|
+
medium: string | null;
|
|
148
|
+
} | null;
|
|
149
|
+
description: string | null;
|
|
150
|
+
siteUrl: string | null;
|
|
151
|
+
};
|
|
152
|
+
role: CharacterRole;
|
|
153
|
+
voiceActors: VoiceActor[];
|
|
154
|
+
}
|
|
155
|
+
/** Voice actor (Staff) basic info. */
|
|
156
|
+
export interface VoiceActor {
|
|
157
|
+
id: number;
|
|
158
|
+
image: {
|
|
159
|
+
large: string | null;
|
|
160
|
+
medium: string | null;
|
|
161
|
+
} | null;
|
|
162
|
+
language: StaffLanguage | null;
|
|
163
|
+
name: {
|
|
164
|
+
full: string | null;
|
|
165
|
+
native: string | null;
|
|
166
|
+
};
|
|
167
|
+
siteUrl: string | null;
|
|
168
|
+
}
|
|
169
|
+
/** Full staff/VA with media roles. */
|
|
170
|
+
export interface StaffWithRoles {
|
|
171
|
+
characterMedia: {
|
|
172
|
+
pageInfo: {
|
|
173
|
+
hasNextPage: boolean;
|
|
174
|
+
currentPage: number;
|
|
175
|
+
};
|
|
176
|
+
edges: Array<{
|
|
177
|
+
characterRole: CharacterRole;
|
|
178
|
+
node: MediaNode;
|
|
179
|
+
characters: Array<{
|
|
180
|
+
id: number;
|
|
181
|
+
name: {
|
|
182
|
+
full: string | null;
|
|
183
|
+
native: string | null;
|
|
184
|
+
};
|
|
185
|
+
}>;
|
|
186
|
+
}>;
|
|
187
|
+
};
|
|
188
|
+
description: string | null;
|
|
189
|
+
id: number;
|
|
190
|
+
image: {
|
|
191
|
+
large: string | null;
|
|
192
|
+
medium: string | null;
|
|
193
|
+
} | null;
|
|
194
|
+
language: StaffLanguage | null;
|
|
195
|
+
name: {
|
|
196
|
+
full: string | null;
|
|
197
|
+
native: string | null;
|
|
198
|
+
};
|
|
199
|
+
siteUrl: string | null;
|
|
200
|
+
}
|
|
201
|
+
/** A character with their media appearances. */
|
|
202
|
+
export interface CharacterWithMedia {
|
|
203
|
+
description: string | null;
|
|
204
|
+
id: number;
|
|
205
|
+
image: {
|
|
206
|
+
large: string | null;
|
|
207
|
+
medium: string | null;
|
|
208
|
+
} | null;
|
|
209
|
+
media: {
|
|
210
|
+
pageInfo: {
|
|
211
|
+
hasNextPage: boolean;
|
|
212
|
+
currentPage: number;
|
|
213
|
+
};
|
|
214
|
+
nodes: MediaNode[];
|
|
215
|
+
edges: Array<{
|
|
216
|
+
characterRole: CharacterRole;
|
|
217
|
+
voiceActors: VoiceActor[];
|
|
218
|
+
}>;
|
|
219
|
+
};
|
|
220
|
+
name: {
|
|
221
|
+
full: string | null;
|
|
222
|
+
native: string | null;
|
|
223
|
+
};
|
|
224
|
+
siteUrl: string | null;
|
|
225
|
+
}
|
|
226
|
+
/** A recommendation node. */
|
|
227
|
+
export interface RecommendationNode {
|
|
228
|
+
mediaRecommendation: MediaNode | null;
|
|
229
|
+
rating: number | null;
|
|
230
|
+
}
|
|
231
|
+
/** AniList airing schedule entry. */
|
|
232
|
+
export interface AiringSchedule {
|
|
233
|
+
airingAt: number;
|
|
234
|
+
episode: number;
|
|
235
|
+
id: number;
|
|
236
|
+
media: MediaNode;
|
|
237
|
+
timeUntilAiring: number;
|
|
238
|
+
}
|
|
239
|
+
/** Studio full detail. */
|
|
240
|
+
export interface StudioDetail {
|
|
241
|
+
id: number;
|
|
242
|
+
isAnimationStudio: boolean;
|
|
243
|
+
media: {
|
|
244
|
+
pageInfo: {
|
|
245
|
+
total: number | null;
|
|
246
|
+
currentPage: number;
|
|
247
|
+
lastPage: number | null;
|
|
248
|
+
hasNextPage: boolean;
|
|
249
|
+
};
|
|
250
|
+
nodes: MediaNode[];
|
|
251
|
+
};
|
|
252
|
+
name: string;
|
|
253
|
+
siteUrl: string | null;
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/anilist/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/anilist/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Jikan v4 service — REST client wrapping https://api.jikan.moe/v4 (MyAnimeList proxy).
|
|
3
|
+
* Media-type-aware: routes to /anime/... or /manga/... based on media_type.
|
|
4
|
+
* Rate limit: ~3 req/sec; enforces 350ms minimum between calls.
|
|
5
|
+
* @module services/jikan/jikan-service
|
|
6
|
+
*/
|
|
7
|
+
import type { JikanMedia, JikanPagination, JikanRecommendation, JikanSearchResult } from './types.js';
|
|
8
|
+
/** Get full detail for one anime or manga by MAL ID. Returns null if not found. */
|
|
9
|
+
export declare function getMediaFull(malId: number, mediaType: 'ANIME' | 'MANGA'): Promise<JikanMedia | null>;
|
|
10
|
+
/** Search anime or manga by query. */
|
|
11
|
+
export declare function searchMedia(params: {
|
|
12
|
+
query: string;
|
|
13
|
+
mediaType: 'ANIME' | 'MANGA';
|
|
14
|
+
page?: number;
|
|
15
|
+
limit?: number;
|
|
16
|
+
}): Promise<{
|
|
17
|
+
results: JikanSearchResult[];
|
|
18
|
+
pagination: JikanPagination | null;
|
|
19
|
+
}>;
|
|
20
|
+
/** Get recommendations for an anime or manga by MAL ID. */
|
|
21
|
+
export declare function getRecommendations(malId: number, mediaType: 'ANIME' | 'MANGA'): Promise<JikanRecommendation[]>;
|
|
22
|
+
//# sourceMappingURL=jikan-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jikan-service.d.ts","sourceRoot":"","sources":["../../../src/services/jikan/jikan-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AA0EpB,mFAAmF;AACnF,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,OAAO,GAAG,OAAO,GAC3B,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAI5B;AAED,sCAAsC;AACtC,wBAAsB,WAAW,CAAC,MAAM,EAAE;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAAC,UAAU,EAAE,eAAe,GAAG,IAAI,CAAA;CAAE,CAAC,CAYhF;AAED,2DAA2D;AAC3D,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,OAAO,GAAG,OAAO,GAC3B,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAIhC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Jikan v4 service — REST client wrapping https://api.jikan.moe/v4 (MyAnimeList proxy).
|
|
3
|
+
* Media-type-aware: routes to /anime/... or /manga/... based on media_type.
|
|
4
|
+
* Rate limit: ~3 req/sec; enforces 350ms minimum between calls.
|
|
5
|
+
* @module services/jikan/jikan-service
|
|
6
|
+
*/
|
|
7
|
+
import { serviceUnavailable } from '@cyanheads/mcp-ts-core/errors';
|
|
8
|
+
import { fetchWithTimeout, requestContextService, withRetry } from '@cyanheads/mcp-ts-core/utils';
|
|
9
|
+
// ─── Constants ────────────────────────────────────────────────────────────────
|
|
10
|
+
const JIKAN_BASE = 'https://api.jikan.moe/v4';
|
|
11
|
+
const TIMEOUT_MS = 15_000;
|
|
12
|
+
const REQUEST_CONTEXT = requestContextService.createRequestContext({ operation: 'jikan-service' });
|
|
13
|
+
const MIN_INTERVAL_MS = 350;
|
|
14
|
+
// ─── Rate-limit guard ─────────────────────────────────────────────────────────
|
|
15
|
+
let _lastCallAt = 0;
|
|
16
|
+
async function throttle() {
|
|
17
|
+
const now = Date.now();
|
|
18
|
+
const elapsed = now - _lastCallAt;
|
|
19
|
+
if (elapsed < MIN_INTERVAL_MS) {
|
|
20
|
+
await new Promise((r) => setTimeout(r, MIN_INTERVAL_MS - elapsed));
|
|
21
|
+
}
|
|
22
|
+
_lastCallAt = Date.now();
|
|
23
|
+
}
|
|
24
|
+
// ─── Core fetch ───────────────────────────────────────────────────────────────
|
|
25
|
+
/**
|
|
26
|
+
* Execute a GET request against Jikan. Returns parsed JSON body or null if not found.
|
|
27
|
+
* Jikan returns HTTP 5xx for nonexistent MAL IDs (upstream proxy issue) — treat 5xx on
|
|
28
|
+
* ID lookups as "not found or MAL unavailable" rather than a server error.
|
|
29
|
+
*/
|
|
30
|
+
async function get(path, params) {
|
|
31
|
+
await throttle();
|
|
32
|
+
const url = new URL(`${JIKAN_BASE}${path}`);
|
|
33
|
+
if (params) {
|
|
34
|
+
for (const [k, v] of Object.entries(params)) {
|
|
35
|
+
if (v !== undefined)
|
|
36
|
+
url.searchParams.set(k, String(v));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return withRetry(async () => {
|
|
40
|
+
const resp = await fetchWithTimeout(url.toString(), TIMEOUT_MS, REQUEST_CONTEXT);
|
|
41
|
+
if (resp.status === 404)
|
|
42
|
+
return null;
|
|
43
|
+
// Jikan returns 500 for nonexistent MAL IDs (UpstreamException) — treat as not found
|
|
44
|
+
if (resp.status >= 500)
|
|
45
|
+
return null;
|
|
46
|
+
if (!resp.ok) {
|
|
47
|
+
throw serviceUnavailable(`Jikan returned HTTP ${resp.status}`, { status: resp.status });
|
|
48
|
+
}
|
|
49
|
+
return (await resp.json());
|
|
50
|
+
}, {
|
|
51
|
+
maxRetries: 2,
|
|
52
|
+
baseDelayMs: 1000,
|
|
53
|
+
maxDelayMs: 5000,
|
|
54
|
+
operation: 'jikan-get',
|
|
55
|
+
context: REQUEST_CONTEXT,
|
|
56
|
+
// Don't retry 5xx — they're "not found" for Jikan
|
|
57
|
+
isTransient: (e) => {
|
|
58
|
+
const msg = e instanceof Error ? e.message.toLowerCase() : '';
|
|
59
|
+
return msg.includes('timeout') || msg.includes('serviceunavailable');
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
// ─── Service methods ──────────────────────────────────────────────────────────
|
|
64
|
+
/** Get full detail for one anime or manga by MAL ID. Returns null if not found. */
|
|
65
|
+
export async function getMediaFull(malId, mediaType) {
|
|
66
|
+
const noun = mediaType === 'ANIME' ? 'anime' : 'manga';
|
|
67
|
+
const result = await get(`/${noun}/${malId}/full`);
|
|
68
|
+
return result?.data ?? null;
|
|
69
|
+
}
|
|
70
|
+
/** Search anime or manga by query. */
|
|
71
|
+
export async function searchMedia(params) {
|
|
72
|
+
const noun = params.mediaType === 'ANIME' ? 'anime' : 'manga';
|
|
73
|
+
const result = await get(`/${noun}`, {
|
|
74
|
+
q: params.query,
|
|
75
|
+
page: params.page ?? 1,
|
|
76
|
+
limit: Math.min(params.limit ?? 20, 25),
|
|
77
|
+
});
|
|
78
|
+
return {
|
|
79
|
+
results: result?.data ?? [],
|
|
80
|
+
pagination: result?.pagination ?? null,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/** Get recommendations for an anime or manga by MAL ID. */
|
|
84
|
+
export async function getRecommendations(malId, mediaType) {
|
|
85
|
+
const noun = mediaType === 'ANIME' ? 'anime' : 'manga';
|
|
86
|
+
const result = await get(`/${noun}/${malId}/recommendations`);
|
|
87
|
+
return result?.data ?? [];
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=jikan-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jikan-service.js","sourceRoot":"","sources":["../../../src/services/jikan/jikan-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Jikan v4 service types — normalized domain types for the Jikan REST API (MAL proxy).
|
|
3
|
+
* @module services/jikan/types
|
|
4
|
+
*/
|
|
5
|
+
/** Jikan anime/manga full detail. */
|
|
6
|
+
export interface JikanMedia {
|
|
7
|
+
chapters: number | null;
|
|
8
|
+
episodes: number | null;
|
|
9
|
+
/** External links */
|
|
10
|
+
external: Array<{
|
|
11
|
+
name: string;
|
|
12
|
+
url: string;
|
|
13
|
+
}> | null;
|
|
14
|
+
favorites: number | null;
|
|
15
|
+
images: {
|
|
16
|
+
jpg?: {
|
|
17
|
+
image_url: string | null;
|
|
18
|
+
small_image_url: string | null;
|
|
19
|
+
large_image_url: string | null;
|
|
20
|
+
};
|
|
21
|
+
webp?: {
|
|
22
|
+
image_url: string | null;
|
|
23
|
+
small_image_url: string | null;
|
|
24
|
+
large_image_url: string | null;
|
|
25
|
+
};
|
|
26
|
+
} | null;
|
|
27
|
+
mal_id: number;
|
|
28
|
+
popularity: number | null;
|
|
29
|
+
rank: number | null;
|
|
30
|
+
score: number | null;
|
|
31
|
+
scored_by: number | null;
|
|
32
|
+
status: string | null;
|
|
33
|
+
/** Streaming sources (anime only) */
|
|
34
|
+
streaming: Array<{
|
|
35
|
+
name: string;
|
|
36
|
+
url: string;
|
|
37
|
+
}> | null;
|
|
38
|
+
synopsis: string | null;
|
|
39
|
+
title: string;
|
|
40
|
+
title_english: string | null;
|
|
41
|
+
title_japanese: string | null;
|
|
42
|
+
type: string | null;
|
|
43
|
+
url: string | null;
|
|
44
|
+
volumes: number | null;
|
|
45
|
+
}
|
|
46
|
+
/** A single recommendation entry from Jikan. */
|
|
47
|
+
export interface JikanRecommendation {
|
|
48
|
+
entry: {
|
|
49
|
+
mal_id: number;
|
|
50
|
+
url: string | null;
|
|
51
|
+
images: {
|
|
52
|
+
jpg?: {
|
|
53
|
+
image_url: string | null;
|
|
54
|
+
};
|
|
55
|
+
} | null;
|
|
56
|
+
title: string;
|
|
57
|
+
};
|
|
58
|
+
votes: number;
|
|
59
|
+
}
|
|
60
|
+
/** Jikan search result item (lighter than full). */
|
|
61
|
+
export interface JikanSearchResult {
|
|
62
|
+
chapters: number | null;
|
|
63
|
+
episodes: number | null;
|
|
64
|
+
mal_id: number;
|
|
65
|
+
rank: number | null;
|
|
66
|
+
score: number | null;
|
|
67
|
+
scored_by: number | null;
|
|
68
|
+
status: string | null;
|
|
69
|
+
title: string;
|
|
70
|
+
title_english: string | null;
|
|
71
|
+
type: string | null;
|
|
72
|
+
url: string | null;
|
|
73
|
+
}
|
|
74
|
+
/** Jikan pagination info. */
|
|
75
|
+
export interface JikanPagination {
|
|
76
|
+
current_page: number;
|
|
77
|
+
has_next_page: boolean;
|
|
78
|
+
items: {
|
|
79
|
+
count: number;
|
|
80
|
+
total: number;
|
|
81
|
+
per_page: number;
|
|
82
|
+
};
|
|
83
|
+
last_visible_page: number;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/jikan/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/jikan/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Kitsu service — JSON:API client wrapping https://kitsu.io/api/edge.
|
|
3
|
+
* Provides streaming links (anime only) and MAL ID → Kitsu ID mapping.
|
|
4
|
+
* Streaming links are anime-only; Kitsu calls are skipped entirely for MANGA.
|
|
5
|
+
* @module services/kitsu/kitsu-service
|
|
6
|
+
*/
|
|
7
|
+
import type { KitsuStreamingResult } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Get streaming links for an anime by MAL ID.
|
|
10
|
+
* Resolves MAL ID → Kitsu ID, then fetches streaming links.
|
|
11
|
+
* Returns null when Kitsu lookup fails (graceful degradation).
|
|
12
|
+
*/
|
|
13
|
+
export declare function getAnimeStreamingByMalId(malId: number): Promise<KitsuStreamingResult | null>;
|
|
14
|
+
//# sourceMappingURL=kitsu-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kitsu-service.d.ts","sourceRoot":"","sources":["../../../src/services/kitsu/kitsu-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAsB,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAwG3E;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAMtC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Kitsu service — JSON:API client wrapping https://kitsu.io/api/edge.
|
|
3
|
+
* Provides streaming links (anime only) and MAL ID → Kitsu ID mapping.
|
|
4
|
+
* Streaming links are anime-only; Kitsu calls are skipped entirely for MANGA.
|
|
5
|
+
* @module services/kitsu/kitsu-service
|
|
6
|
+
*/
|
|
7
|
+
import { fetchWithTimeout, requestContextService, withRetry } from '@cyanheads/mcp-ts-core/utils';
|
|
8
|
+
// ─── Constants ────────────────────────────────────────────────────────────────
|
|
9
|
+
const KITSU_BASE = 'https://kitsu.io/api/edge';
|
|
10
|
+
const TIMEOUT_MS = 12_000;
|
|
11
|
+
const REQUEST_CONTEXT = requestContextService.createRequestContext({ operation: 'kitsu-service' });
|
|
12
|
+
// ─── Core fetch ───────────────────────────────────────────────────────────────
|
|
13
|
+
function get(path, params) {
|
|
14
|
+
const url = new URL(`${KITSU_BASE}${path}`);
|
|
15
|
+
if (params) {
|
|
16
|
+
for (const [k, v] of Object.entries(params)) {
|
|
17
|
+
url.searchParams.set(k, v);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return withRetry(async () => {
|
|
21
|
+
const resp = await fetchWithTimeout(url.toString(), TIMEOUT_MS, REQUEST_CONTEXT, {
|
|
22
|
+
headers: {
|
|
23
|
+
Accept: 'application/vnd.api+json',
|
|
24
|
+
'Content-Type': 'application/vnd.api+json',
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
if (resp.status === 404)
|
|
28
|
+
return null;
|
|
29
|
+
if (!resp.ok)
|
|
30
|
+
return null; // Degrade gracefully — Kitsu is a supplement
|
|
31
|
+
return (await resp.json());
|
|
32
|
+
}, {
|
|
33
|
+
maxRetries: 2,
|
|
34
|
+
baseDelayMs: 1000,
|
|
35
|
+
maxDelayMs: 5000,
|
|
36
|
+
operation: 'kitsu-get',
|
|
37
|
+
context: REQUEST_CONTEXT,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
// ─── Service methods ──────────────────────────────────────────────────────────
|
|
41
|
+
/**
|
|
42
|
+
* Find Kitsu anime ID by MAL ID using the mappings filter.
|
|
43
|
+
* Returns null if not found.
|
|
44
|
+
*/
|
|
45
|
+
async function findKitsuAnimeId(malId) {
|
|
46
|
+
// Kitsu's mappings endpoint with externalSite filter returns mapping records;
|
|
47
|
+
// the relationships.item data contains the kitsu ID
|
|
48
|
+
const result = await get('/mappings', {
|
|
49
|
+
'filter[externalSite]': 'myanimelist/anime',
|
|
50
|
+
'filter[externalId]': String(malId),
|
|
51
|
+
include: 'item',
|
|
52
|
+
'fields[anime]': 'id',
|
|
53
|
+
});
|
|
54
|
+
if (!result?.data?.length)
|
|
55
|
+
return null;
|
|
56
|
+
const rel = result.data[0]?.relationships?.item?.data;
|
|
57
|
+
if (rel && rel.type === 'anime')
|
|
58
|
+
return rel.id;
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get streaming links for an anime by Kitsu ID.
|
|
63
|
+
* Returns empty array on failure (supplement service — degrades gracefully).
|
|
64
|
+
*/
|
|
65
|
+
async function getStreamingLinks(kitsuId) {
|
|
66
|
+
// Guard: Kitsu IDs are numeric strings (e.g. "7442"). Reject anything that would
|
|
67
|
+
// escape the path segment (traversal, scheme injection) via a malformed API response.
|
|
68
|
+
if (!/^\d+$/.test(kitsuId))
|
|
69
|
+
return [];
|
|
70
|
+
const result = await get(`/anime/${kitsuId}`, { include: 'streamingLinks' });
|
|
71
|
+
if (!result?.included)
|
|
72
|
+
return [];
|
|
73
|
+
return result.included
|
|
74
|
+
.filter((item) => item.type === 'streamingLinks')
|
|
75
|
+
.map((item) => ({
|
|
76
|
+
id: item.id,
|
|
77
|
+
url: item.attributes.url,
|
|
78
|
+
subs: item.attributes.subs ?? [],
|
|
79
|
+
dubs: item.attributes.dubs ?? [],
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get streaming links for an anime by MAL ID.
|
|
84
|
+
* Resolves MAL ID → Kitsu ID, then fetches streaming links.
|
|
85
|
+
* Returns null when Kitsu lookup fails (graceful degradation).
|
|
86
|
+
*/
|
|
87
|
+
export async function getAnimeStreamingByMalId(malId) {
|
|
88
|
+
const kitsuId = await findKitsuAnimeId(malId);
|
|
89
|
+
if (!kitsuId)
|
|
90
|
+
return null;
|
|
91
|
+
const links = await getStreamingLinks(kitsuId);
|
|
92
|
+
return { kitsuId, streamingLinks: links };
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=kitsu-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kitsu-service.js","sourceRoot":"","sources":["../../../src/services/kitsu/kitsu-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Kitsu service types — normalized domain types for the Kitsu JSON:API.
|
|
3
|
+
* @module services/kitsu/types
|
|
4
|
+
*/
|
|
5
|
+
/** A streaming link from Kitsu's included[] array. */
|
|
6
|
+
export interface KitsuStreamingLink {
|
|
7
|
+
dubs: string[];
|
|
8
|
+
id: string;
|
|
9
|
+
subs: string[];
|
|
10
|
+
url: string;
|
|
11
|
+
}
|
|
12
|
+
/** Result from resolving Kitsu ID + streaming links. */
|
|
13
|
+
export interface KitsuStreamingResult {
|
|
14
|
+
kitsuId: string;
|
|
15
|
+
streamingLinks: KitsuStreamingLink[];
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/kitsu/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,sDAAsD;AACtD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wDAAwD;AACxD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,kBAAkB,EAAE,CAAC;CACtC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/kitsu/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|