Houzeric commited on
Commit
cd9b20b
·
verified ·
1 Parent(s): 20cbe73

Upload 6 files

Browse files
README.md CHANGED
@@ -1,14 +1,55 @@
1
  ---
2
- title: Pokemon Mcp
3
- emoji: 🦀
4
- colorFrom: yellow
5
  colorTo: yellow
6
  sdk: gradio
7
- sdk_version: 5.33.0
8
  app_file: app.py
9
  pinned: false
10
- license: apache-2.0
11
- short_description: My Custom MCP Analyzes and estimate level of pokemon
 
12
  ---
13
 
14
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: PokeAPI-MCP
3
+ emoji: 🐾
4
+ colorFrom: red
5
  colorTo: yellow
6
  sdk: gradio
7
+ sdk_version: 5.32.1
8
  app_file: app.py
9
  pinned: false
10
+ license: mit
11
+ short_description: Expose full access to PokéAPI as MCP.
12
+ tags: [mcp-server-track, pokeapi, pokemon, agent, api-wrapper]
13
  ---
14
 
15
+ # 🐾 PokeAPI-MCP Agent Access to the Entire PokéAPI
16
+
17
+ **PokeAPI-MCP** is a modular Gradio-based agent toolset that exposes nearly all major endpoints of the [PokéAPI v2](https://pokeapi.co/docs/v2) via a Multi-Component Protocol (MCP) interface. It allows agents to query real-time Pokémon data like species, stats, types, evolutions, and much more — without writing a single line of API code.
18
+
19
+ ## 🎥 Demo Video
20
+
21
+ ▶️ [Watch the demo](https://youtu.be/Hyovc5FYOYo)
22
+
23
+
24
+ ## 🎯 What This App Does
25
+
26
+ - Wraps all key PokéAPI endpoints (species, evolution, moves, items, abilities, etc.)
27
+ - Exposes each endpoint as a Gradio `Interface`, usable via MCP
28
+ - Dynamically generates JSON outputs for agent-friendly consumption
29
+ - Supports queries by both name and numeric ID
30
+ - Provides automatic error handling and clean descriptions for each tool
31
+
32
+ ## ✨ Available Tools
33
+
34
+ - 🔍 `get_pokemon` — full data about a Pokémon
35
+ - 📖 `get_pokemon_species` — flavor text, gender rate, evolution chain
36
+ - 🧠 `get_ability`, `get_stat`, `get_type` — detailed mechanics
37
+ - 🎒 `get_item`, `get_berry` — held/useable item details
38
+ - 🧬 `get_evolution_chain` — structured evolution trees
39
+ - 🌍 `get_region`, `get_location` — geographical data
40
+ - 🗺️ `get_pokedex`, `get_generation`, `get_version`, `get_version_group`
41
+ - 🧬 `get_egg_group`, `get_pokemon_form`, `get_pokemon_shape`, `get_pokemon_color`, `get_pokemon_habitat`
42
+
43
+ ...and more.
44
+
45
+ ## 🔧 Tech Stack
46
+
47
+ - **Gradio** – for exposing interfaces and MCP support
48
+ - **requests** – lightweight HTTP client for API access
49
+ - **PokéAPI v2** – the full public REST API of the Pokémon world
50
+
51
+ ## 💻 Run Locally
52
+
53
+ ```bash
54
+ pip install -r requirements.txt
55
+ python app.py
fr_to_en_pokemon.json ADDED
@@ -0,0 +1,1027 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bulbizarre": "bulbasaur",
3
+ "herbizarre": "ivysaur",
4
+ "florizarre": "venusaur",
5
+ "salamèche": "charmander",
6
+ "reptincel": "charmeleon",
7
+ "dracaufeu": "charizard",
8
+ "carapuce": "squirtle",
9
+ "carabaffe": "wartortle",
10
+ "tortank": "blastoise",
11
+ "chenipan": "caterpie",
12
+ "chrysacier": "metapod",
13
+ "papilusion": "butterfree",
14
+ "aspicot": "weedle",
15
+ "coconfort": "kakuna",
16
+ "dardargnan": "beedrill",
17
+ "roucool": "pidgey",
18
+ "roucoups": "pidgeotto",
19
+ "roucarnage": "pidgeot",
20
+ "rattata": "rattata",
21
+ "rattatac": "raticate",
22
+ "piafabec": "spearow",
23
+ "rapasdepic": "fearow",
24
+ "abo": "ekans",
25
+ "arbok": "arbok",
26
+ "pikachu": "pikachu",
27
+ "raichu": "raichu",
28
+ "sabelette": "sandshrew",
29
+ "sablaireau": "sandslash",
30
+ "nidoran♀": "nidoran♀",
31
+ "nidorina": "nidorina",
32
+ "nidoqueen": "nidoqueen",
33
+ "nidoran♂": "nidoran♂",
34
+ "nidorino": "nidorino",
35
+ "nidoking": "nidoking",
36
+ "mélofée": "clefairy",
37
+ "mélodelfe": "clefable",
38
+ "goupix": "vulpix",
39
+ "feunard": "ninetales",
40
+ "rondoudou": "jigglypuff",
41
+ "grodoudou": "wigglytuff",
42
+ "nosferapti": "zubat",
43
+ "nosferalto": "golbat",
44
+ "mystherbe": "oddish",
45
+ "ortide": "gloom",
46
+ "rafflesia": "vileplume",
47
+ "paras": "paras",
48
+ "parasect": "parasect",
49
+ "mimitoss": "venonat",
50
+ "aéromite": "venomoth",
51
+ "taupiqueur": "diglett",
52
+ "triopikeur": "dugtrio",
53
+ "miaouss": "meowth",
54
+ "persian": "persian",
55
+ "psykokwak": "psyduck",
56
+ "akwakwak": "golduck",
57
+ "férosinge": "mankey",
58
+ "colossinge": "primeape",
59
+ "caninos": "growlithe",
60
+ "arcanin": "arcanine",
61
+ "ptitard": "poliwag",
62
+ "têtarte": "poliwhirl",
63
+ "tartard": "poliwrath",
64
+ "abra": "abra",
65
+ "kadabra": "kadabra",
66
+ "alakazam": "alakazam",
67
+ "machoc": "machop",
68
+ "machopeur": "machoke",
69
+ "mackogneur": "machamp",
70
+ "chétiflor": "bellsprout",
71
+ "boustiflor": "weepinbell",
72
+ "empiflor": "victreebel",
73
+ "tentacool": "tentacool",
74
+ "tentacruel": "tentacruel",
75
+ "racaillou": "geodude",
76
+ "gravalanch": "graveler",
77
+ "grolem": "golem",
78
+ "ponyta": "ponyta",
79
+ "galopa": "rapidash",
80
+ "ramoloss": "slowpoke",
81
+ "flagadoss": "slowbro",
82
+ "magnéti": "magnemite",
83
+ "magnéton": "magneton",
84
+ "canarticho": "farfetch’d",
85
+ "doduo": "doduo",
86
+ "dodrio": "dodrio",
87
+ "otaria": "seel",
88
+ "lamantine": "dewgong",
89
+ "tadmorv": "grimer",
90
+ "grotadmorv": "muk",
91
+ "kokiyas": "shellder",
92
+ "crustabri": "cloyster",
93
+ "fantominus": "gastly",
94
+ "spectrum": "haunter",
95
+ "ectoplasma": "gengar",
96
+ "onix": "onix",
97
+ "soporifik": "drowzee",
98
+ "hypnomade": "hypno",
99
+ "krabby": "krabby",
100
+ "krabboss": "kingler",
101
+ "voltorbe": "voltorb",
102
+ "électrode": "electrode",
103
+ "noeunoeuf": "exeggcute",
104
+ "noadkoko": "exeggutor",
105
+ "osselait": "cubone",
106
+ "ossatueur": "marowak",
107
+ "kicklee": "hitmonlee",
108
+ "tygnon": "hitmonchan",
109
+ "excelangue": "lickitung",
110
+ "smogo": "koffing",
111
+ "smogogo": "weezing",
112
+ "rhinocorne": "rhyhorn",
113
+ "rhinoféros": "rhydon",
114
+ "leveinard": "chansey",
115
+ "saquedeneu": "tangela",
116
+ "kangourex": "kangaskhan",
117
+ "hypotrempe": "horsea",
118
+ "hypocéan": "seadra",
119
+ "poissirène": "goldeen",
120
+ "poissoroy": "seaking",
121
+ "stari": "staryu",
122
+ "staross": "starmie",
123
+ "m. mime": "mr. mime",
124
+ "insécateur": "scyther",
125
+ "lippoutou": "jynx",
126
+ "élektek": "electabuzz",
127
+ "magmar": "magmar",
128
+ "scarabrute": "pinsir",
129
+ "tauros": "tauros",
130
+ "magicarpe": "magikarp",
131
+ "léviator": "gyarados",
132
+ "lokhlass": "lapras",
133
+ "métamorph": "ditto",
134
+ "évoli": "eevee",
135
+ "aquali": "vaporeon",
136
+ "voltali": "jolteon",
137
+ "pyroli": "flareon",
138
+ "porygon": "porygon",
139
+ "amonita": "omanyte",
140
+ "amonistar": "omastar",
141
+ "kabuto": "kabuto",
142
+ "kabutops": "kabutops",
143
+ "ptéra": "aerodactyl",
144
+ "ronflex": "snorlax",
145
+ "artikodin": "articuno",
146
+ "électhor": "zapdos",
147
+ "sulfura": "moltres",
148
+ "minidraco": "dratini",
149
+ "draco": "dragonair",
150
+ "dracolosse": "dragonite",
151
+ "mewtwo": "mewtwo",
152
+ "mew": "mew",
153
+ "germignon": "chikorita",
154
+ "macronium": "bayleef",
155
+ "méganium": "meganium",
156
+ "héricendre": "cyndaquil",
157
+ "feurisson": "quilava",
158
+ "typhlosion": "typhlosion",
159
+ "kaiminus": "totodile",
160
+ "crocrodil": "croconaw",
161
+ "aligatueur": "feraligatr",
162
+ "fouinette": "sentret",
163
+ "fouinar": "furret",
164
+ "hoothoot": "hoothoot",
165
+ "noarfang": "noctowl",
166
+ "coxy": "ledyba",
167
+ "coxyclaque": "ledian",
168
+ "mimigal": "spinarak",
169
+ "migalos": "ariados",
170
+ "nostenfer": "crobat",
171
+ "loupio": "chinchou",
172
+ "lanturn": "lanturn",
173
+ "pichu": "pichu",
174
+ "mélo": "cleffa",
175
+ "toudoudou": "igglybuff",
176
+ "togepi": "togepi",
177
+ "togetic": "togetic",
178
+ "natu": "natu",
179
+ "xatu": "xatu",
180
+ "wattouat": "mareep",
181
+ "lainergie": "flaaffy",
182
+ "pharamp": "ampharos",
183
+ "joliflor": "bellossom",
184
+ "marill": "marill",
185
+ "azumarill": "azumarill",
186
+ "simularbre": "sudowoodo",
187
+ "tarpaud": "politoed",
188
+ "granivol": "hoppip",
189
+ "floravol": "skiploom",
190
+ "cotovol": "jumpluff",
191
+ "capumain": "aipom",
192
+ "tournegrin": "sunkern",
193
+ "héliatronc": "sunflora",
194
+ "yanma": "yanma",
195
+ "axoloto": "wooper",
196
+ "maraiste": "quagsire",
197
+ "mentali": "espeon",
198
+ "noctali": "umbreon",
199
+ "cornèbre": "murkrow",
200
+ "roigada": "slowking",
201
+ "feuforêve": "misdreavus",
202
+ "zarbi": "unown",
203
+ "qulbutoké": "wobbuffet",
204
+ "girafarig": "girafarig",
205
+ "pomdepik": "pineco",
206
+ "foretress": "forretress",
207
+ "insolourdo": "dunsparce",
208
+ "scorplane": "gligar",
209
+ "steelix": "steelix",
210
+ "snubbull": "snubbull",
211
+ "granbull": "granbull",
212
+ "qwilfish": "qwilfish",
213
+ "cizayox": "scizor",
214
+ "caratroc": "shuckle",
215
+ "scarhino": "heracross",
216
+ "farfuret": "sneasel",
217
+ "teddiursa": "teddiursa",
218
+ "ursaring": "ursaring",
219
+ "limagma": "slugma",
220
+ "volcaropod": "magcargo",
221
+ "marcacrin": "swinub",
222
+ "cochignon": "piloswine",
223
+ "corayon": "corsola",
224
+ "rémoraid": "remoraid",
225
+ "octillery": "octillery",
226
+ "cadoizo": "delibird",
227
+ "démanta": "mantine",
228
+ "airmure": "skarmory",
229
+ "malosse": "houndour",
230
+ "démolosse": "houndoom",
231
+ "hyporoi": "kingdra",
232
+ "phanpy": "phanpy",
233
+ "donphan": "donphan",
234
+ "porygon2": "porygon2",
235
+ "cerfrousse": "stantler",
236
+ "queulorior": "smeargle",
237
+ "debugant": "tyrogue",
238
+ "kapoera": "hitmontop",
239
+ "lippouti": "smoochum",
240
+ "élekid": "elekid",
241
+ "magby": "magby",
242
+ "écrémeuh": "miltank",
243
+ "leuphorie": "blissey",
244
+ "raikou": "raikou",
245
+ "entei": "entei",
246
+ "suicune": "suicune",
247
+ "embrylex": "larvitar",
248
+ "ymphect": "pupitar",
249
+ "tyranocif": "tyranitar",
250
+ "lugia": "lugia",
251
+ "ho-oh": "ho-oh",
252
+ "celebi": "celebi",
253
+ "arcko": "treecko",
254
+ "massko": "grovyle",
255
+ "jungko": "sceptile",
256
+ "poussifeu": "torchic",
257
+ "galifeu": "combusken",
258
+ "braségali": "blaziken",
259
+ "gobou": "mudkip",
260
+ "flobio": "marshtomp",
261
+ "laggron": "swampert",
262
+ "medhyèna": "poochyena",
263
+ "grahyèna": "mightyena",
264
+ "zigzaton": "zigzagoon",
265
+ "linéon": "linoone",
266
+ "chenipotte": "wurmple",
267
+ "armulys": "silcoon",
268
+ "charmillon": "beautifly",
269
+ "blindalys": "cascoon",
270
+ "papinox": "dustox",
271
+ "nénupiot": "lotad",
272
+ "lombre": "lombre",
273
+ "ludicolo": "ludicolo",
274
+ "grainipiot": "seedot",
275
+ "pifeuil": "nuzleaf",
276
+ "tengalice": "shiftry",
277
+ "nirondelle": "taillow",
278
+ "hélédelle": "swellow",
279
+ "goélise": "wingull",
280
+ "bekipan": "pelipper",
281
+ "tarsal": "ralts",
282
+ "kirlia": "kirlia",
283
+ "gardevoir": "gardevoir",
284
+ "arakdo": "surskit",
285
+ "maskadra": "masquerain",
286
+ "balignon": "shroomish",
287
+ "chapignon": "breloom",
288
+ "parecool": "slakoth",
289
+ "vigoroth": "vigoroth",
290
+ "monaflèmit": "slaking",
291
+ "ningale": "nincada",
292
+ "ninjask": "ninjask",
293
+ "munja": "shedinja",
294
+ "chuchmur": "whismur",
295
+ "ramboum": "loudred",
296
+ "brouhabam": "exploud",
297
+ "makuhita": "makuhita",
298
+ "hariyama": "hariyama",
299
+ "azurill": "azurill",
300
+ "tarinor": "nosepass",
301
+ "skitty": "skitty",
302
+ "delcatty": "delcatty",
303
+ "ténéfix": "sableye",
304
+ "mysdibule": "mawile",
305
+ "galekid": "aron",
306
+ "galegon": "lairon",
307
+ "galeking": "aggron",
308
+ "méditikka": "meditite",
309
+ "charmina": "medicham",
310
+ "dynavolt": "electrike",
311
+ "élecsprint": "manectric",
312
+ "posipi": "plusle",
313
+ "négapi": "minun",
314
+ "muciole": "volbeat",
315
+ "lumivole": "illumise",
316
+ "rosélia": "roselia",
317
+ "gloupti": "gulpin",
318
+ "avaltout": "swalot",
319
+ "carvanha": "carvanha",
320
+ "sharpedo": "sharpedo",
321
+ "wailmer": "wailmer",
322
+ "wailord": "wailord",
323
+ "chamallot": "numel",
324
+ "camérupt": "camerupt",
325
+ "chartor": "torkoal",
326
+ "spoink": "spoink",
327
+ "groret": "grumpig",
328
+ "spinda": "spinda",
329
+ "kraknoix": "trapinch",
330
+ "vibraninf": "vibrava",
331
+ "libégon": "flygon",
332
+ "cacnea": "cacnea",
333
+ "cacturne": "cacturne",
334
+ "tylton": "swablu",
335
+ "altaria": "altaria",
336
+ "mangriff": "zangoose",
337
+ "séviper": "seviper",
338
+ "séléroc": "lunatone",
339
+ "solaroc": "solrock",
340
+ "barloche": "barboach",
341
+ "barbicha": "whiscash",
342
+ "écrapince": "corphish",
343
+ "colhomard": "crawdaunt",
344
+ "balbuto": "baltoy",
345
+ "kaorine": "claydol",
346
+ "lilia": "lileep",
347
+ "vacilys": "cradily",
348
+ "anorith": "anorith",
349
+ "armaldo": "armaldo",
350
+ "barpau": "feebas",
351
+ "milobellus": "milotic",
352
+ "morphéo": "castform",
353
+ "kecleon": "kecleon",
354
+ "polichombr": "shuppet",
355
+ "branette": "banette",
356
+ "skelénox": "duskull",
357
+ "téraclope": "dusclops",
358
+ "tropius": "tropius",
359
+ "éoko": "chimecho",
360
+ "absol": "absol",
361
+ "okéoké": "wynaut",
362
+ "stalgamin": "snorunt",
363
+ "oniglali": "glalie",
364
+ "obalie": "spheal",
365
+ "phogleur": "sealeo",
366
+ "kaimorse": "walrein",
367
+ "coquiperl": "clamperl",
368
+ "serpang": "huntail",
369
+ "rosabyss": "gorebyss",
370
+ "relicanth": "relicanth",
371
+ "lovdisc": "luvdisc",
372
+ "draby": "bagon",
373
+ "drackhaus": "shelgon",
374
+ "drattak": "salamence",
375
+ "terhal": "beldum",
376
+ "métang": "metang",
377
+ "métalosse": "metagross",
378
+ "regirock": "regirock",
379
+ "regice": "regice",
380
+ "registeel": "registeel",
381
+ "latias": "latias",
382
+ "latios": "latios",
383
+ "kyogre": "kyogre",
384
+ "groudon": "groudon",
385
+ "rayquaza": "rayquaza",
386
+ "jirachi": "jirachi",
387
+ "deoxys": "deoxys",
388
+ "tortipouss": "turtwig",
389
+ "boskara": "grotle",
390
+ "torterra": "torterra",
391
+ "ouisticram": "chimchar",
392
+ "chimpenfeu": "monferno",
393
+ "simiabraz": "infernape",
394
+ "tiplouf": "piplup",
395
+ "prinplouf": "prinplup",
396
+ "pingoléon": "empoleon",
397
+ "étourmi": "starly",
398
+ "étourvol": "staravia",
399
+ "étouraptor": "staraptor",
400
+ "keunotor": "bidoof",
401
+ "castorno": "bibarel",
402
+ "crikzik": "kricketot",
403
+ "mélokrik": "kricketune",
404
+ "lixy": "shinx",
405
+ "luxio": "luxio",
406
+ "luxray": "luxray",
407
+ "rozbouton": "budew",
408
+ "roserade": "roserade",
409
+ "kranidos": "cranidos",
410
+ "charkos": "rampardos",
411
+ "dinoclier": "shieldon",
412
+ "bastiodon": "bastiodon",
413
+ "cheniti": "burmy",
414
+ "cheniselle": "wormadam",
415
+ "papilord": "mothim",
416
+ "apitrini": "combee",
417
+ "apireine": "vespiquen",
418
+ "pachirisu": "pachirisu",
419
+ "mustébouée": "buizel",
420
+ "mustéflott": "floatzel",
421
+ "ceribou": "cherubi",
422
+ "ceriflor": "cherrim",
423
+ "sancoki": "shellos",
424
+ "tritosor": "gastrodon",
425
+ "capidextre": "ambipom",
426
+ "baudrive": "drifloon",
427
+ "grodrive": "drifblim",
428
+ "laporeille": "buneary",
429
+ "lockpin": "lopunny",
430
+ "magirêve": "mismagius",
431
+ "corboss": "honchkrow",
432
+ "chaglam": "glameow",
433
+ "chaffreux": "purugly",
434
+ "korillon": "chingling",
435
+ "moufouette": "stunky",
436
+ "moufflair": "skuntank",
437
+ "archéomire": "bronzor",
438
+ "archéodong": "bronzong",
439
+ "manzaï": "bonsly",
440
+ "mime jr.": "mime jr.",
441
+ "ptiravi": "happiny",
442
+ "pijako": "chatot",
443
+ "spiritomb": "spiritomb",
444
+ "griknot": "gible",
445
+ "carmache": "gabite",
446
+ "carchacrok": "garchomp",
447
+ "goinfrex": "munchlax",
448
+ "riolu": "riolu",
449
+ "lucario": "lucario",
450
+ "hippopotas": "hippopotas",
451
+ "hippodocus": "hippowdon",
452
+ "rapion": "skorupi",
453
+ "drascore": "drapion",
454
+ "cradopaud": "croagunk",
455
+ "coatox": "toxicroak",
456
+ "vortente": "carnivine",
457
+ "écayon": "finneon",
458
+ "luminéon": "lumineon",
459
+ "babimanta": "mantyke",
460
+ "blizzi": "snover",
461
+ "blizzaroi": "abomasnow",
462
+ "dimoret": "weavile",
463
+ "magnézone": "magnezone",
464
+ "coudlangue": "lickilicky",
465
+ "rhinastoc": "rhyperior",
466
+ "bouldeneu": "tangrowth",
467
+ "élekable": "electivire",
468
+ "maganon": "magmortar",
469
+ "togekiss": "togekiss",
470
+ "yanmega": "yanmega",
471
+ "phyllali": "leafeon",
472
+ "givrali": "glaceon",
473
+ "scorvol": "gliscor",
474
+ "mammochon": "mamoswine",
475
+ "porygon-z": "porygon-z",
476
+ "gallame": "gallade",
477
+ "tarinorme": "probopass",
478
+ "noctunoir": "dusknoir",
479
+ "momartik": "froslass",
480
+ "motisma": "rotom",
481
+ "créhelf": "uxie",
482
+ "créfollet": "mesprit",
483
+ "créfadet": "azelf",
484
+ "dialga": "dialga",
485
+ "palkia": "palkia",
486
+ "heatran": "heatran",
487
+ "regigigas": "regigigas",
488
+ "giratina": "giratina",
489
+ "cresselia": "cresselia",
490
+ "phione": "phione",
491
+ "manaphy": "manaphy",
492
+ "darkrai": "darkrai",
493
+ "shaymin": "shaymin",
494
+ "arceus": "arceus",
495
+ "victini": "victini",
496
+ "vipélierre": "snivy",
497
+ "lianaja": "servine",
498
+ "majaspic": "serperior",
499
+ "gruikui": "tepig",
500
+ "grotichon": "pignite",
501
+ "roitiflam": "emboar",
502
+ "moustillon": "oshawott",
503
+ "mateloutre": "dewott",
504
+ "clamiral": "samurott",
505
+ "ratentif": "patrat",
506
+ "miradar": "watchog",
507
+ "ponchiot": "lillipup",
508
+ "ponchien": "herdier",
509
+ "mastouffe": "stoutland",
510
+ "chacripan": "purrloin",
511
+ "léopardus": "liepard",
512
+ "feuillajou": "pansage",
513
+ "feuiloutan": "simisage",
514
+ "flamajou": "pansear",
515
+ "flamoutan": "simisear",
516
+ "flotajou": "panpour",
517
+ "flotoutan": "simipour",
518
+ "munna": "munna",
519
+ "mushana": "musharna",
520
+ "poichigeon": "pidove",
521
+ "colombeau": "tranquill",
522
+ "déflaisan": "unfezant",
523
+ "zébibron": "blitzle",
524
+ "zéblitz": "zebstrika",
525
+ "nodulithe": "roggenrola",
526
+ "géolithe": "boldore",
527
+ "gigalithe": "gigalith",
528
+ "chovsourir": "woobat",
529
+ "rhinolove": "swoobat",
530
+ "rototaupe": "drilbur",
531
+ "minotaupe": "excadrill",
532
+ "nanméouïe": "audino",
533
+ "charpenti": "timburr",
534
+ "ouvrifier": "gurdurr",
535
+ "bétochef": "conkeldurr",
536
+ "tritonde": "tympole",
537
+ "batracné": "palpitoad",
538
+ "crapustule": "seismitoad",
539
+ "judokrak": "throh",
540
+ "karaclée": "sawk",
541
+ "larveyette": "sewaddle",
542
+ "couverdure": "swadloon",
543
+ "manternel": "leavanny",
544
+ "venipatte": "venipede",
545
+ "scobolide": "whirlipede",
546
+ "brutapode": "scolipede",
547
+ "doudouvet": "cottonee",
548
+ "farfaduvet": "whimsicott",
549
+ "chlorobule": "petilil",
550
+ "fragilady": "lilligant",
551
+ "bargantua": "basculin",
552
+ "mascaïman": "sandile",
553
+ "escroco": "krokorok",
554
+ "crocorible": "krookodile",
555
+ "darumarond": "darumaka",
556
+ "darumacho": "darmanitan",
557
+ "maracachi": "maractus",
558
+ "crabicoque": "dwebble",
559
+ "crabaraque": "crustle",
560
+ "baggiguane": "scraggy",
561
+ "baggaïd": "scrafty",
562
+ "cryptéro": "sigilyph",
563
+ "tutafeh": "yamask",
564
+ "tutankafer": "cofagrigus",
565
+ "carapagos": "tirtouga",
566
+ "mégapagos": "carracosta",
567
+ "arkéapti": "archen",
568
+ "aéroptéryx": "archeops",
569
+ "miamiasme": "trubbish",
570
+ "miasmax": "garbodor",
571
+ "zorua": "zorua",
572
+ "zoroark": "zoroark",
573
+ "chinchidou": "minccino",
574
+ "pashmilla": "cinccino",
575
+ "scrutella": "gothita",
576
+ "mesmérella": "gothorita",
577
+ "sidérella": "gothitelle",
578
+ "nucléos": "solosis",
579
+ "méios": "duosion",
580
+ "symbios": "reuniclus",
581
+ "couaneton": "ducklett",
582
+ "lakmécygne": "swanna",
583
+ "sorbébé": "vanillite",
584
+ "sorboul": "vanillish",
585
+ "sorbouboul": "vanilluxe",
586
+ "vivaldaim": "deerling",
587
+ "haydaim": "sawsbuck",
588
+ "emolga": "emolga",
589
+ "carabing": "karrablast",
590
+ "lançargot": "escavalier",
591
+ "trompignon": "foongus",
592
+ "gaulet": "amoonguss",
593
+ "viskuse": "frillish",
594
+ "moyade": "jellicent",
595
+ "mamanbo": "alomomola",
596
+ "statitik": "joltik",
597
+ "mygavolt": "galvantula",
598
+ "grindur": "ferroseed",
599
+ "noacier": "ferrothorn",
600
+ "tic": "klink",
601
+ "clic": "klang",
602
+ "cliticlic": "klinklang",
603
+ "anchwatt": "tynamo",
604
+ "lampéroie": "eelektrik",
605
+ "ohmassacre": "eelektross",
606
+ "lewsor": "elgyem",
607
+ "neitram": "beheeyem",
608
+ "funécire": "litwick",
609
+ "mélancolux": "lampent",
610
+ "lugulabre": "chandelure",
611
+ "coupenotte": "axew",
612
+ "incisache": "fraxure",
613
+ "tranchodon": "haxorus",
614
+ "polarhume": "cubchoo",
615
+ "polagriffe": "beartic",
616
+ "hexagel": "cryogonal",
617
+ "escargaume": "shelmet",
618
+ "limaspeed": "accelgor",
619
+ "limonde": "stunfisk",
620
+ "kungfouine": "mienfoo",
621
+ "shaofouine": "mienshao",
622
+ "drakkarmin": "druddigon",
623
+ "gringolem": "golett",
624
+ "golemastoc": "golurk",
625
+ "scalpion": "pawniard",
626
+ "scalproie": "bisharp",
627
+ "frison": "bouffalant",
628
+ "furaiglon": "rufflet",
629
+ "gueriaigle": "braviary",
630
+ "vostourno": "vullaby",
631
+ "vaututrice": "mandibuzz",
632
+ "aflamanoir": "heatmor",
633
+ "fermite": "durant",
634
+ "solochi": "deino",
635
+ "diamat": "zweilous",
636
+ "trioxhydre": "hydreigon",
637
+ "pyronille": "larvesta",
638
+ "pyrax": "volcarona",
639
+ "cobaltium": "cobalion",
640
+ "terrakium": "terrakion",
641
+ "viridium": "virizion",
642
+ "boréas": "tornadus",
643
+ "fulguris": "thundurus",
644
+ "reshiram": "reshiram",
645
+ "zekrom": "zekrom",
646
+ "démétéros": "landorus",
647
+ "kyurem": "kyurem",
648
+ "keldeo": "keldeo",
649
+ "meloetta": "meloetta",
650
+ "genesect": "genesect",
651
+ "marisson": "chespin",
652
+ "boguérisse": "quilladin",
653
+ "blindépique": "chesnaught",
654
+ "feunnec": "fennekin",
655
+ "roussil": "braixen",
656
+ "goupelin": "delphox",
657
+ "grenousse": "froakie",
658
+ "croâporal": "frogadier",
659
+ "amphinobi": "greninja",
660
+ "sapereau": "bunnelby",
661
+ "excavarenne": "diggersby",
662
+ "passerouge": "fletchling",
663
+ "braisillon": "fletchinder",
664
+ "flambusard": "talonflame",
665
+ "lépidonille": "scatterbug",
666
+ "pérégrain": "spewpa",
667
+ "prismillon": "vivillon",
668
+ "hélionceau": "litleo",
669
+ "némélios": "pyroar",
670
+ "flabébé": "flabébé",
671
+ "floette": "floette",
672
+ "florges": "florges",
673
+ "cabriolaine": "skiddo",
674
+ "chevroum": "gogoat",
675
+ "pandespiègle": "pancham",
676
+ "pandarbare": "pangoro",
677
+ "couafarel": "furfrou",
678
+ "psystigri": "espurr",
679
+ "mistigrix": "meowstic",
680
+ "monorpale": "honedge",
681
+ "dimoclès": "doublade",
682
+ "exagide": "aegislash",
683
+ "fluvetin": "spritzee",
684
+ "cocotine": "aromatisse",
685
+ "sucroquin": "swirlix",
686
+ "cupcanaille": "slurpuff",
687
+ "sepiatop": "inkay",
688
+ "sepiatroce": "malamar",
689
+ "opermine": "binacle",
690
+ "golgopathe": "barbaracle",
691
+ "venalgue": "skrelp",
692
+ "kravarech": "dragalge",
693
+ "flingouste": "clauncher",
694
+ "gamblast": "clawitzer",
695
+ "galvaran": "helioptile",
696
+ "iguolta": "heliolisk",
697
+ "ptyranidur": "tyrunt",
698
+ "rexillius": "tyrantrum",
699
+ "amagara": "amaura",
700
+ "dragmara": "aurorus",
701
+ "nymphali": "sylveon",
702
+ "brutalibré": "hawlucha",
703
+ "dedenne": "dedenne",
704
+ "strassie": "carbink",
705
+ "mucuscule": "goomy",
706
+ "colimucus": "sliggoo",
707
+ "muplodocus": "goodra",
708
+ "trousselin": "klefki",
709
+ "brocélôme": "phantump",
710
+ "desséliande": "trevenant",
711
+ "pitrouille": "pumpkaboo",
712
+ "banshitrouye": "gourgeist",
713
+ "grelaçon": "bergmite",
714
+ "séracrawl": "avalugg",
715
+ "sonistrelle": "noibat",
716
+ "bruyverne": "noivern",
717
+ "xerneas": "xerneas",
718
+ "yveltal": "yveltal",
719
+ "zygarde": "zygarde",
720
+ "diancie": "diancie",
721
+ "hoopa": "hoopa",
722
+ "volcanion": "volcanion",
723
+ "brindibou": "rowlet",
724
+ "efflèche": "dartrix",
725
+ "archéduc": "decidueye",
726
+ "flamiaou": "litten",
727
+ "matoufeu": "torracat",
728
+ "félinferno": "incineroar",
729
+ "otaquin": "popplio",
730
+ "otarlette": "brionne",
731
+ "oratoria": "primarina",
732
+ "picassaut": "pikipek",
733
+ "piclairon": "trumbeak",
734
+ "bazoucan": "toucannon",
735
+ "manglouton": "yungoos",
736
+ "argouste": "gumshoos",
737
+ "larvibule": "grubbin",
738
+ "chrysapile": "charjabug",
739
+ "lucanon": "vikavolt",
740
+ "crabagarre": "crabrawler",
741
+ "crabominable": "crabominable",
742
+ "plumeline": "oricorio",
743
+ "bombydou": "cutiefly",
744
+ "rubombelle": "ribombee",
745
+ "rocabot": "rockruff",
746
+ "lougaroc": "lycanroc",
747
+ "froussardine": "wishiwashi",
748
+ "vorastérie": "mareanie",
749
+ "prédastérie": "toxapex",
750
+ "tiboudet": "mudbray",
751
+ "bourrinos": "mudsdale",
752
+ "araqua": "dewpider",
753
+ "tarenbulle": "araquanid",
754
+ "mimantis": "fomantis",
755
+ "floramantis": "lurantis",
756
+ "spododo": "morelull",
757
+ "lampignon": "shiinotic",
758
+ "tritox": "salandit",
759
+ "malamandre": "salazzle",
760
+ "nounourson": "stufful",
761
+ "chelours": "bewear",
762
+ "croquine": "bounsweet",
763
+ "candine": "steenee",
764
+ "sucreine": "tsareena",
765
+ "guérilande": "comfey",
766
+ "gouroutan": "oranguru",
767
+ "quartermac": "passimian",
768
+ "sovkipou": "wimpod",
769
+ "sarmuraï": "golisopod",
770
+ "bacabouh": "sandygast",
771
+ "trépassable": "palossand",
772
+ "concombaffe": "pyukumuku",
773
+ "type:0": "type: null",
774
+ "silvallié": "silvally",
775
+ "météno": "minior",
776
+ "dodoala": "komala",
777
+ "boumata": "turtonator",
778
+ "togedemaru": "togedemaru",
779
+ "mimiqui": "mimikyu",
780
+ "denticrisse": "bruxish",
781
+ "draïeul": "drampa",
782
+ "sinistrail": "dhelmise",
783
+ "bébécaille": "jangmo-o",
784
+ "écaïd": "hakamo-o",
785
+ "ékaïser": "kommo-o",
786
+ "tokorico": "tapu koko",
787
+ "tokopiyon": "tapu lele",
788
+ "tokotoro": "tapu bulu",
789
+ "tokopisco": "tapu fini",
790
+ "cosmog": "cosmog",
791
+ "cosmovum": "cosmoem",
792
+ "solgaleo": "solgaleo",
793
+ "lunala": "lunala",
794
+ "zéroïd": "nihilego",
795
+ "mouscoto": "buzzwole",
796
+ "cancrelove": "pheromosa",
797
+ "câblifère": "xurkitree",
798
+ "bamboiselle": "celesteela",
799
+ "katagami": "kartana",
800
+ "engloutyran": "guzzlord",
801
+ "necrozma": "necrozma",
802
+ "magearna": "magearna",
803
+ "marshadow": "marshadow",
804
+ "vémini": "poipole",
805
+ "mandrillon": "naganadel",
806
+ "ama-ama": "stakataka",
807
+ "pierroteknik": "blacephalon",
808
+ "zeraora": "zeraora",
809
+ "meltan": "meltan",
810
+ "melmetal": "melmetal",
811
+ "ouistempo": "grookey",
812
+ "badabouin": "thwackey",
813
+ "gorythmic": "rillaboom",
814
+ "flambino": "scorbunny",
815
+ "lapyro": "raboot",
816
+ "pyrobut": "cinderace",
817
+ "larméléon": "sobble",
818
+ "arrozard": "drizzile",
819
+ "lézargus": "inteleon",
820
+ "rongourmand": "skwovet",
821
+ "rongrigou": "greedent",
822
+ "minisange": "rookidee",
823
+ "bleuseille": "corvisquire",
824
+ "corvaillus": "corviknight",
825
+ "larvadar": "blipbug",
826
+ "coléodôme": "dottler",
827
+ "astronelle": "orbeetle",
828
+ "goupilou": "nickit",
829
+ "roublenard": "thievul",
830
+ "tournicoton": "gossifleur",
831
+ "blancoton": "eldegoss",
832
+ "moumouton": "wooloo",
833
+ "moumouflon": "dubwool",
834
+ "khélocrok": "chewtle",
835
+ "torgamord": "drednaw",
836
+ "voltoutou": "yamper",
837
+ "fulgudog": "boltund",
838
+ "charbi": "rolycoly",
839
+ "wagomine": "carkol",
840
+ "monthracite": "coalossal",
841
+ "verpom": "applin",
842
+ "pomdrapi": "flapple",
843
+ "dratatin": "appletun",
844
+ "dunaja": "silicobra",
845
+ "dunaconda": "sandaconda",
846
+ "nigosier": "cramorant",
847
+ "embrochet": "arrokuda",
848
+ "hastacuda": "barraskewda",
849
+ "toxizap": "toxel",
850
+ "salarsen": "toxtricity",
851
+ "grillepattes": "sizzlipede",
852
+ "scolocendre": "centiskorch",
853
+ "poulpaf": "clobbopus",
854
+ "krakos": "grapploct",
855
+ "théffroi": "sinistea",
856
+ "polthégeist": "polteageist",
857
+ "bibichut": "hatenna",
858
+ "chapotus": "hattrem",
859
+ "sorcilence": "hatterene",
860
+ "grimalin": "impidimp",
861
+ "fourbelin": "morgrem",
862
+ "angoliath": "grimmsnarl",
863
+ "ixon": "obstagoon",
864
+ "berserkatt": "perrserker",
865
+ "corayôme": "cursola",
866
+ "palarticho": "sirfetch’d",
867
+ "m. glaquette": "mr. rime",
868
+ "tutétékri": "runerigus",
869
+ "crèmy": "milcery",
870
+ "charmilly": "alcremie",
871
+ "hexadron": "falinks",
872
+ "wattapik": "pincurchin",
873
+ "frissonille": "snom",
874
+ "beldeneige": "frosmoth",
875
+ "dolman": "stonjourner",
876
+ "bekaglaçon": "eiscue",
877
+ "wimessir": "indeedee",
878
+ "morpeko": "morpeko",
879
+ "charibari": "cufant",
880
+ "pachyradjah": "copperajah",
881
+ "galvagon": "dracozolt",
882
+ "galvagla": "arctozolt",
883
+ "hydragon": "dracovish",
884
+ "hydragla": "arctovish",
885
+ "duralugon": "duraludon",
886
+ "fantyrm": "dreepy",
887
+ "dispareptil": "drakloak",
888
+ "lanssorien": "dragapult",
889
+ "zacian": "zacian",
890
+ "zamazenta": "zamazenta",
891
+ "éthernatos": "eternatus",
892
+ "wushours": "kubfu",
893
+ "shifours": "urshifu",
894
+ "zarude": "zarude",
895
+ "regieleki": "regieleki",
896
+ "regidrago": "regidrago",
897
+ "blizzeval": "glastrier",
898
+ "spectreval": "spectrier",
899
+ "sylveroy": "calyrex",
900
+ "cerbyllin": "wyrdeer",
901
+ "hachécateur": "kleavor",
902
+ "ursaking": "ursaluna",
903
+ "paragruel": "basculegion",
904
+ "farfurex": "sneasler",
905
+ "qwilpik": "overqwil",
906
+ "amovénus": "enamorus",
907
+ "poussacha": "sprigatito",
908
+ "matourgeon": "floragato",
909
+ "miascarade": "meowscarada",
910
+ "chochodile": "fuecoco",
911
+ "crocogril": "crocalor",
912
+ "flâmigator": "skeledirge",
913
+ "coiffeton": "quaxly",
914
+ "canarbello": "quaxwell",
915
+ "palmaval": "quaquaval",
916
+ "gourmelet": "lechonk",
917
+ "fragroin": "oinkologne",
918
+ "tissenboule": "tarountula",
919
+ "filentrappe": "spidops",
920
+ "lilliterelle": "nymble",
921
+ "gambex": "lokix",
922
+ "pohm": "pawmi",
923
+ "pohmotte": "pawmo",
924
+ "pohmarmotte": "pawmot",
925
+ "compagnol": "tandemaus",
926
+ "famignol": "maushold",
927
+ "pâtachiot": "fidough",
928
+ "briochien": "dachsbun",
929
+ "olivini": "smoliv",
930
+ "olivado": "dolliv",
931
+ "arboliva": "arboliva",
932
+ "tapatoès": "squawkabilly",
933
+ "selutin": "nacli",
934
+ "amassel": "naclstack",
935
+ "gigansel": "garganacl",
936
+ "charbambin": "charcadet",
937
+ "carmadura": "armarouge",
938
+ "malvalame": "ceruledge",
939
+ "têtampoule": "tadbulb",
940
+ "ampibidou": "bellibolt",
941
+ "zapétrel": "wattrel",
942
+ "fulgulairo": "kilowattrel",
943
+ "grondogue": "maschiff",
944
+ "dogrino": "mabosstiff",
945
+ "gribouraigne": "shroodle",
946
+ "tag-tag": "grafaiai",
947
+ "virovent": "bramblin",
948
+ "virevorreur": "brambleghast",
949
+ "terracool": "toedscool",
950
+ "terracruel": "toedscruel",
951
+ "craparoi": "klawf",
952
+ "pimito": "capsakid",
953
+ "scovilain": "scovillain",
954
+ "léboulérou": "rellor",
955
+ "bérasca": "rabsca",
956
+ "flotillon": "flittle",
957
+ "cléopsytra": "espathra",
958
+ "forgerette": "tinkatink",
959
+ "forgella": "tinkatuff",
960
+ "forgelina": "tinkaton",
961
+ "taupikeau": "wiglett",
962
+ "triopikeau": "wugtrio",
963
+ "lestombaile": "bombirdier",
964
+ "dofin": "finizen",
965
+ "superdofin": "palafin",
966
+ "vrombi": "varoom",
967
+ "vrombotor": "revavroom",
968
+ "motorizard": "cyclizar",
969
+ "ferdeter": "orthworm",
970
+ "germéclat": "glimmet",
971
+ "floréclat": "glimmora",
972
+ "toutombe": "greavard",
973
+ "tomberro": "houndstone",
974
+ "flamenroule": "flamigo",
975
+ "piétacé": "cetoddle",
976
+ "balbalèze": "cetitan",
977
+ "délestin": "veluza",
978
+ "oyacata": "dondozo",
979
+ "nigirigon": "tatsugiri",
980
+ "courrousinge": "annihilape",
981
+ "terraiste": "clodsire",
982
+ "farigiraf": "farigiraf",
983
+ "deusolourdo": "dudunsparce",
984
+ "scalpereur": "kingambit",
985
+ "fort-ivoire": "great tusk",
986
+ "hurle-queue": "scream tail",
987
+ "fongus-furie": "brute bonnet",
988
+ "flotte-mèche": "flutter mane",
989
+ "rampe-ailes": "slither wing",
990
+ "pelage-sablé": "sandy shocks",
991
+ "roue-de-fer": "iron treads",
992
+ "hotte-de-fer": "iron bundle",
993
+ "paume-de-fer": "iron hands",
994
+ "têtes-de-fer": "iron jugulis",
995
+ "mite-de-fer": "iron moth",
996
+ "épine-de-fer": "iron thorns",
997
+ "frigodo": "frigibax",
998
+ "cryodo": "arctibax",
999
+ "glaivodo": "baxcalibur",
1000
+ "mordudor": "gimmighoul",
1001
+ "gromago": "gholdengo",
1002
+ "chongjian": "wo-chien",
1003
+ "baojian": "chien-pao",
1004
+ "dinglu": "ting-lu",
1005
+ "yuyu": "chi-yu",
1006
+ "rugit-lune": "roaring moon",
1007
+ "garde-de-fer": "iron valiant",
1008
+ "koraidon": "koraidon",
1009
+ "miraidon": "miraidon",
1010
+ "serpente-eau": "walking wake",
1011
+ "vert-de-fer": "iron leaves",
1012
+ "pomdramour": "dipplin",
1013
+ "poltchageist": "poltchageist",
1014
+ "théffroyable": "sinistcha",
1015
+ "félicanis": "okidogi",
1016
+ "fortusimia": "munkidori",
1017
+ "favianos": "fezandipiti",
1018
+ "ogerpon": "ogerpon",
1019
+ "pondralugon": "archaludon",
1020
+ "pomdorochi": "hydrapple",
1021
+ "feu-perçant": "gouging fire",
1022
+ "ire-foudre": "raging bolt",
1023
+ "roc-de-fer": "iron boulder",
1024
+ "chef-de-fer": "iron crown",
1025
+ "terapagos": "terapagos",
1026
+ "pêchaminus": "pecharunt"
1027
+ }
generate-translation- name.py ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import requests
2
+ import json
3
+ import time
4
+
5
+ def build_fr_to_en_map():
6
+ fr_to_en = {}
7
+ total_species = 1025 # nombre approximatif de Pokémon en 2025
8
+ print("⏳ Récupération des noms depuis PokéAPI...")
9
+
10
+ for species_id in range(1, total_species + 1):
11
+ url = f"https://pokeapi.co/api/v2/pokemon-species/{species_id}/"
12
+ try:
13
+ res = requests.get(url)
14
+ res.raise_for_status()
15
+ data = res.json()
16
+
17
+ name_en = None
18
+ name_fr = None
19
+ for entry in data["names"]:
20
+ lang = entry["language"]["name"]
21
+ if lang == "en":
22
+ name_en = entry["name"]
23
+ elif lang == "fr":
24
+ name_fr = entry["name"]
25
+
26
+ if name_en and name_fr:
27
+ fr_to_en[name_fr.lower()] = name_en.lower()
28
+
29
+ print(f"✅ {species_id}: {name_fr} ➝ {name_en}")
30
+ time.sleep(0.1) # pour éviter de spam l'API
31
+
32
+ except Exception as e:
33
+ print(f"⚠️ Erreur à l'ID {species_id} : {e}")
34
+ continue
35
+
36
+ return fr_to_en
37
+
38
+ if __name__ == "__main__":
39
+ mapping = build_fr_to_en_map()
40
+
41
+ # Sauvegarde dans un fichier JSON
42
+ with open("fr_to_en_pokemon.json", "w", encoding="utf-8") as f:
43
+ json.dump(mapping, f, ensure_ascii=False, indent=2)
44
+
45
+ print("\n✅ Fichier 'fr_to_en_pokemon.json' généré avec succès.")
import-data.py ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from datasets import load_dataset
3
+ from PIL import Image
4
+ from io import BytesIO
5
+ import requests
6
+ import open_clip
7
+ import chromadb
8
+
9
+ # 1. Setup CLIP
10
+ device = "cuda" if torch.cuda.is_available() else "cpu"
11
+ model, _, preprocess = open_clip.create_model_and_transforms('ViT-B-32', pretrained='openai')
12
+ model = model.to(device).eval()
13
+
14
+ # 2. Load Pokémon cards dataset
15
+ dataset = load_dataset("TheFusion21/PokemonCards", split="train")
16
+
17
+ # 3. Setup ChromaDB client
18
+ client = chromadb.PersistentClient(path="./chroma_db")
19
+ collection = client.get_or_create_collection(
20
+ name="pokemon_cards_clip",
21
+ metadata={"hnsw:space": "cosine"}
22
+ )
23
+
24
+ # 4. Insert embeddings into ChromaDB if not already indexed
25
+ if collection.count() == 0:
26
+ print("📦 Indexing images into ChromaDB...")
27
+
28
+ for i, entry in enumerate(dataset):
29
+ try:
30
+ url = entry.get("image_url")
31
+ if not url:
32
+ continue
33
+
34
+ # Téléchargement et prétraitement de l'image
35
+ response = requests.get(url, timeout=10)
36
+ image = Image.open(BytesIO(response.content)).convert("RGB")
37
+ image_input = preprocess(image).unsqueeze(0).to(device)
38
+
39
+ # Extraction de l'embedding
40
+ with torch.no_grad():
41
+ image_features = model.encode_image(image_input)
42
+ image_features /= image_features.norm(dim=-1, keepdim=True)
43
+
44
+ # Ajout dans la collection
45
+ collection.add(
46
+ ids=[f"card-{i}"],
47
+ embeddings=[image_features.squeeze().cpu().tolist()],
48
+ metadatas=[{
49
+ "name": entry.get("name", ""),
50
+ "set": entry.get("set_name", ""),
51
+ "hp": entry.get("hp", ""),
52
+ "image_url": url,
53
+ "caption": entry.get("caption", "")
54
+ }]
55
+ )
56
+
57
+ if i % 100 == 0:
58
+ print(f"✅ {i} cartes indexées...")
59
+
60
+ except Exception as e:
61
+ print(f"❌ Erreur sur carte {i}: {e}")
62
+
63
+ print("✅ Indexation terminée.")
64
+
65
+ else:
66
+ print("✅ Les embeddings sont déjà présents dans ChromaDB.")
pokedex.py ADDED
@@ -0,0 +1,233 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import requests
2
+ import math
3
+ import json
4
+ import os
5
+ import chromadb
6
+
7
+ with open("fr_to_en_pokemon.json", "r", encoding="utf-8") as f:
8
+ FR_TO_EN_MAP = json.load(f)
9
+
10
+ client = chromadb.PersistentClient(path="./chroma_db")
11
+ collection = client.get_or_create_collection(name="pokemon_cards_clip")
12
+ print(f"📦 Nombre de cartesen base : {collection.count()}")
13
+
14
+ def get_english_name(pokemon_name: str) -> str:
15
+ name = pokemon_name.strip().lower().replace(" ", "-")
16
+
17
+ if name in [v.replace(" ", "-") for v in FR_TO_EN_MAP.values()]:
18
+ return name
19
+
20
+ english = FR_TO_EN_MAP.get(name)
21
+ if english:
22
+ return english.lower().replace(" ", "-")
23
+
24
+ return "❌ nom-non-reconnu"
25
+
26
+ def calculate_stat(base, level, iv=31, ev=0, nature=1.0, stat_name="hp"):
27
+ if stat_name == "hp":
28
+ return math.floor(((2 * base + iv + (ev // 4)) * level) / 100) + level + 10
29
+ else:
30
+ return math.floor((((2 * base + iv + (ev // 4)) * level) / 100 + 5) * nature)
31
+
32
+ def estimate_level_from_hp(observed_hp, base_hp, iv=31, ev=0, tolerance=1):
33
+ for level in range(1, 101):
34
+ computed_hp = math.floor(((2 * base_hp + iv + (ev // 4)) * level) / 100) + level + 10
35
+ if abs(computed_hp - observed_hp) <= tolerance:
36
+ return level
37
+ return None
38
+
39
+ def get_base_hp(pokemon_name: str) -> int:
40
+ base_url = "https://pokeapi.co/api/v2/pokemon/"
41
+ try:
42
+ res = requests.get(base_url + pokemon_name.lower())
43
+ res.raise_for_status()
44
+ data = res.json()
45
+
46
+ # Trouver la stat HP
47
+ for stat in data["stats"]:
48
+ if stat["stat"]["name"] == "hp":
49
+ return stat["base_stat"]
50
+
51
+ raise ValueError("❌ Stat HP non trouvée.")
52
+
53
+ except requests.exceptions.HTTPError:
54
+ raise ValueError("❌ Pokémon introuvable. Vérifie le nom.")
55
+ except Exception as e:
56
+ raise RuntimeError(f"⚠️ Erreur : {str(e)}")
57
+
58
+
59
+ def get_move_details(move_url: str) -> dict:
60
+ res = requests.get(move_url)
61
+ res.raise_for_status()
62
+ move_data = res.json()
63
+
64
+ # Description in French if available, fallback to default
65
+ effect = next(
66
+ (entry['effect'] for entry in move_data['effect_entries'] if entry['language']['name'] == 'en'),
67
+ move_data['effect_entries'][0]['effect'] if move_data['effect_entries'] else "No known effect."
68
+ )
69
+
70
+ effect = effect.replace("$effect_chance", str(move_data.get("effect_chance", "")))
71
+
72
+ return {
73
+ "name": move_data['name'],
74
+ "type": move_data['type']['name'],
75
+ "power": move_data['power'],
76
+ "accuracy": move_data['accuracy'],
77
+ "category": move_data['damage_class']['name'],
78
+ "effect": effect
79
+ }
80
+
81
+ def get_pokemon_info(pokemon_name: str, level=50, version_group='sword-shield') -> str:
82
+ base_url = "https://pokeapi.co/api/v2/"
83
+ try:
84
+ res_pokemon = requests.get(base_url + f"pokemon/{pokemon_name.lower()}")
85
+ res_pokemon.raise_for_status()
86
+ data = res_pokemon.json()
87
+
88
+ res_species = requests.get(base_url + f"pokemon-species/{pokemon_name.lower()}")
89
+ res_species.raise_for_status()
90
+ species = res_species.json()
91
+
92
+ evo_url = species['evolution_chain']['url']
93
+ res_evo = requests.get(evo_url)
94
+ res_evo.raise_for_status()
95
+ evolution_chain = res_evo.json()
96
+
97
+ name = data['name'].capitalize()
98
+ pokemon_id = data['id']
99
+ types = ", ".join([t['type']['name'].capitalize() for t in data['types']])
100
+ height = data['height'] / 10
101
+ weight = data['weight'] / 10
102
+ base_stats = {s['stat']['name']: s['base_stat'] for s in data['stats']}
103
+ stats_lv = {k: calculate_stat(v, level, stat_name=k) for k, v in base_stats.items()}
104
+
105
+ flavor_text = next(
106
+ (entry['flavor_text'].replace("\n", " ").replace("\f", " ")
107
+ for entry in species['flavor_text_entries']
108
+ if entry['language']['name'] == 'en'),
109
+ "No description available."
110
+ )
111
+
112
+ def get_evolutions(chain):
113
+ evols = [chain['species']['name'].capitalize()]
114
+ if chain['evolves_to']:
115
+ for evo in chain['evolves_to']:
116
+ evols.extend(get_evolutions(evo))
117
+ return evols
118
+
119
+ def get_moves(data, level_max, version_group):
120
+ moves = []
121
+ for m in data['moves']:
122
+ for v in m['version_group_details']:
123
+ if (
124
+ v['version_group']['name'] == version_group and
125
+ v['move_learn_method']['name'] == 'level-up' and
126
+ v['level_learned_at'] <= level_max
127
+ ):
128
+ move_details = get_move_details(m['move']['url'])
129
+ move_details['level'] = v['level_learned_at']
130
+ moves.append(move_details)
131
+ moves.sort(key=lambda m: m['level'])
132
+ return moves
133
+
134
+ evolutions = get_evolutions(evolution_chain['chain'])
135
+ evolution_text = " → ".join(evolutions)
136
+
137
+ moves = get_moves(data, level, version_group)
138
+
139
+ # Markdown attack section
140
+ if moves:
141
+ moves_text = "\n".join([
142
+ f"### 🔹 Lv {m['level']} : **{m['name']}**\n"
143
+ f"- Type: {m['type'].capitalize()} \n"
144
+ f"- Category: {m['category'].capitalize()} \n"
145
+ f"- Power: {m['power'] or '—'} \n"
146
+ f"- Accuracy: {m['accuracy'] or '—'} \n"
147
+ f"- Effect: {m['effect']}"
148
+ for m in moves
149
+ ])
150
+ else:
151
+ moves_text = "No available moves at this level."
152
+
153
+ card_image_url = get_card_image_url(pokemon_name)
154
+ card_image_md = f"![Carte Pokémon]({card_image_url})" if card_image_url else "_Carte non trouvée dans la base._"
155
+
156
+ markdown = f"""
157
+ # 📘 Pokémon Sheet: **{name}** (#{pokemon_id})
158
+
159
+ ---
160
+
161
+ {card_image_md}
162
+
163
+ ---
164
+
165
+ **Type(s)**: {types}
166
+ **Height**: {height} m
167
+ **Weight**: {weight} kg
168
+
169
+ ---
170
+
171
+ ## 🔢 Base Stats
172
+
173
+ | Stat | Value |
174
+ |----------------|--------|
175
+ | HP | {base_stats['hp']} |
176
+ | Attack | {base_stats['attack']} |
177
+ | Defense | {base_stats['defense']} |
178
+ | Sp. Atk | {base_stats['special-attack']} |
179
+ | Sp. Def | {base_stats['special-defense']} |
180
+ | Speed | {base_stats['speed']} |
181
+
182
+ ---
183
+
184
+ ## 🎯 Stats at Level {level}
185
+
186
+ | Stat | Value |
187
+ |----------------|--------|
188
+ | HP | {stats_lv['hp']} |
189
+ | Attack | {stats_lv['attack']} |
190
+ | Defense | {stats_lv['defense']} |
191
+ | Sp. Atk | {stats_lv['special-attack']} |
192
+ | Sp. Def | {stats_lv['special-defense']} |
193
+ | Speed | {stats_lv['speed']} |
194
+
195
+ ---
196
+
197
+ ## 🔁 Evolution Chain
198
+
199
+ {evolution_text}
200
+
201
+ ---
202
+
203
+ ## 📜 Moves up to Level {level} (version: {version_group.replace('-', ' ').title()})
204
+
205
+ {moves_text}
206
+
207
+ ---
208
+
209
+ ## 📖 Description
210
+
211
+ > {flavor_text}
212
+ """
213
+ return markdown.strip()
214
+
215
+ except requests.exceptions.HTTPError:
216
+ return "❌ Pokémon not found. Check the name."
217
+ except Exception as e:
218
+ return f"⚠️ Error: {str(e)}"
219
+
220
+
221
+ # Example usage
222
+ #print(get_pokemon_info("scyther", level=50))
223
+
224
+
225
+ def get_card_image_url(pokemon_name: str) -> str:
226
+ """
227
+ Recherche dans ChromaDB une carte dont le nom correspond au Pokémon donné.
228
+ Retourne l'URL de l'image ou None.
229
+ """
230
+ results = collection.get(where={"name": pokemon_name.capitalize()})
231
+ if results and results['metadatas']:
232
+ return results['metadatas'][0].get('image_url')
233
+ return None
requirements.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ gradio[mcp]
2
+ easyocr
3
+ chromadb