Pokemcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Pokemcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A Model Context Protocol (MCP) server that exposes the PokéAPI as tools and resources, letting any MCP-compatible AI assistant look up Pokémon data in real time.
git clone https://github.com/Ragde54/pokemcp.git
cd pokemcp
uv syncPYTHONPATH=src uv run pokemcpNote: ThePYTHONPATH=srcprefix is required due to a known incompatibility between Homebrew Python's venv and editable-install.pthfile processing.
Add the following to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"pokemcp": {
"command": "uv",
"args": ["run", "pokemcp"],
"cwd": "/path/to/pokemcp",
"env": {
"PYTHONPATH": "/path/to/pokemcp/src"
}
}
}
}Replace /path/to/pokemcp with the absolute path to this repository, then restart Claude Desktop.
Settings are read from environment variables or a .env file in the project root.
| Variable | Default | Description |
|---|---|---|
POKEAPI_BASE_URL | https://pokeapi.co/api/v2 | PokéAPI base URL |
REDIS_URL | _(none)_ | Redis URL for persistent caching (e.g. redis://localhost:6379). If unset, an in-memory cache is used. |
CACHE_TTL | 3600 | Cache time-to-live in seconds |
LOG_LEVEL | INFO | Python logging level |
| Tool | Description |
|---|---|
get_pokemon(name_or_id) | Full Pokémon details: types, stats, abilities, sprites, forms, held items, and more |
get_pokemon_species(name_or_id) | Species data: Pokédex flavor text, habitat, generation, legendary/mythical status, gender rate |
get_pokemon_stats(name_or_id) | Base stats (HP, Attack, Defense, Sp. Atk, Sp. Def, Speed) plus total BST |
get_pokemon_abilities(name_or_id) | All abilities and whether each is a hidden ability |
get_evolution_chain(name_or_id) | Full evolution chain with trigger conditions |
list_pokemon(limit, offset) | Paginated list of all Pokémon (max 100 per page) |
search_pokemon_by_type(type_name) | All Pokémon belonging to a given type |
| Tool | Description |
|---|---|
get_move(name_or_id) | Full move details: type, power, accuracy, PP, damage class, effect, and more |
get_move_summary(name_or_id) | Concise move summary with effect description |
get_moves_learned_by_pokemon(name_or_id) | All moves a Pokémon can learn, grouped by learn method (level-up, TM/HM, egg, tutor) |
list_moves(limit, offset) | Paginated list of all moves (max 100 per page) |
get_moves_by_type(type_name) | All moves that belong to a specific type |
| Tool | Description |
|---|---|
get_item(name_or_id) | Full item details: category, cost, effect, attributes, and held-by Pokémon |
get_item_summary(name_or_id) | Concise item summary with short effect and Pokédex flavor text |
list_items(limit, offset) | Paginated list of all items (max 100 per page) |
get_items_by_category(category) | All items in a category (e.g. pokeballs, healing, held-items, berries, evolution) |
get_item_held_by_pokemon(item_name) | All Pokémon that hold an item in the wild, with per-version rarity |
| Tool | Description |
|---|---|
get_type(name_or_id) | Full type details including damage relations, resident Pokémon, and moves |
get_type_matchups(attacking_type) | Offensive chart: super effective / not very effective / no effect / normal |
get_type_defenses(defending_type) | Defensive chart: weak to / resists / immune to |
get_dual_type_matchups(type_one, type_two) | Combined defensive multipliers for a dual-type Pokémon (4×, 2×, 1×, 0.5×, 0.25×, 0×) |
list_types() | List all 18 Pokémon types |
Resources are accessible via URI and return raw JSON.
| URI pattern | Description |
|---|---|
pokedex://pokemon/{name_or_id} | Full Pokémon data |
pokedex://species/{name_or_id} | Species data including Pokédex entries |
pokedex://move/{name_or_id} | Full move data |
pokedex://item/{name_or_id} | Full item data |
pokedex://type/{name_or_id} | Full type data with damage relations |
pokedex://ability/{name_or_id} | Ability data with effect descriptions |
pokedex://generation/{name_or_id} | Generation data with Pokémon species and version groups |
pokedex://pokedex/{name_or_id} | Regional Pokédex entries (e.g. national, kanto) |
src/pokemcp/
├── app.py # Shared FastMCP instance
├── server.py # Entry point — imports all tools/resources
├── config.py # Settings via pydantic-settings
├── api/
│ ├── client.py # Async HTTP client with retry logic
│ └── cache.py # Redis / in-memory cache layer
├── models/
│ └── pokemon.py # Pydantic models (Pokemon, PokemonSummary, EvolutionChain)
├── tools/
│ ├── pokemon.py # Pokémon tools
│ ├── moves.py # Move tools
│ ├── items.py # Item tools
│ └── types.py # Type tools
└── resources/
└── pokedex.py # MCP resourcesAll data is fetched from the PokéAPI — a free, open REST API for Pokémon data. No API key required.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.