pokeapi-mcp-server
An MCP server that provides tools to query PokéAPI v2 for comprehensive Pokémon data including stats, abilities, moves, items, natures, and type matchups. It supports STDIO and Streamable HTTP transports, offering 7 tools, 2 resources, and 1 prompt for agent integration.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://pokeapi.caseyjhand.com/mcpWhat its tools do
7 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Retrieve a denormalized Pokémon dossier with stats, abilities, and evolution chain
- Compute offensive and defensive type effectiveness matchups
- Get detailed move information including power, accuracy, and effect text
- Filter Pokémon by generation, type, or egg group
Source and maintenance
- Maintenance checked
Protocol and capabilities
- Server
- pokeapi-mcp-server 0.3.0
- MCP protocol negotiated in check
- 2025-11-25
- Tools
- 7 advertised
- Resources
- 21 advertised
- Resource templates
- 3 advertised
- Prompts
- 1 advertised
{
"tools": {
"listChanged": true
},
"logging": {},
"prompts": {
"listChanged": true
},
"resources": {
"subscribe": true,
"listChanged": true
},
"extensions": {
"io.modelcontextprotocol/skills": {
"directoryRead": true
}
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
7 advertised
pokeapi_get_pokemon — Get Pokémon
Get a fully denormalized Pokémon dossier in a single call — base stats, types, abilities (with full English effect text), height/weight, resolved evolution chain, sprite URLs including official artwork, species flavor text, variety list, capture rate, growth rate, gender rate, legendary/mythical flags, egg groups, and (optionally) a summarized learnable-move list. Accepts a name (lowercase, hyphens for spaces, e.g. "bulbasaur", "mr-mime") or PokéAPI Pokémon-record ID. A species name with no Pokémon record of its own (e.g. "deoxys") resolves to the default variety of that species ("deoxys-normal"), reported in resolvedFromSpecies. Set include_moves=true to include the move summary (large); defaults to false. Use game_version to select flavor text from a specific game (e.g. "sword", "red"); falls back to the most recent English entry when the version is not found. Use pokeapi_find_pokemon to discover Pokémon by type, generation, or egg group before calling this tool.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"identifier"
],
"properties": {
"identifier": {
"type": "string",
"description": "Pokémon name (lowercase hyphenated, e.g. \"bulbasaur\", \"charizard-mega-x\") or PokéAPI Pokémon-record ID as a string (e.g. \"1\", \"10034\"). A species name (e.g. \"deoxys\") resolves to its default variety."
},
"game_version": {
"type": "string",
"description": "PokéAPI version name to filter flavor text (e.g. \"sword\", \"red\", \"scarlet\"). Falls back to the most recent English entry when the version is not found."
},
"include_moves": {
"type": "boolean",
"default": false,
"description": "Include the full learnable-move summary. Defaults to false because the list is large (100–200+ moves)."
}
},
"additionalProperties": false
}{
"type": "object",
"$defs": {
"__schema0": {
"type": "object",
"required": [
"species",
"trigger",
"minLevel",
"item",
"condition",
"evolutionDetails",
"evolvesTo"
],
"properties": {
"item": {
"type": [
"string",
"null"
],
"description": "First alternative evolution item. Null when unspecified."
},
"species": {
"type": "string",
"description": "Species name."
},
"trigger": {
"type": "string",
"description": "First alternative trigger, or base for the root stage."
},
"minLevel": {
"type": [
"number",
"null"
],
"description": "First alternative minimum level. Null when unspecified."
},
"condition": {
"type": [
"string",
"null"
],
"description": "Compatibility summary of the first alternative; evolutionDetails contains the complete methods."
},
"evolvesTo": {
"type": "array",
"items": {
"$ref": "#/$defs/__schema0"
},
"description": "Further evolutions from this stage."
},
"evolutionDetails": {
"type": "array",
"items": {
"type": "object",
"required": [
"versionGroup",
"isDefault",
"requiredPokemonForm",
"evolvedPokemonForm",
"trigger",
"item",
"gender",
"heldItem",
"knownMove",
"knownMoveType",
"location",
"minLevel",
"minHappiness",
"minBeauty",
"minAffection",
"nearSpecialRock",
"needsMultiplayer",
"needsOverworldRain",
"partySpecies",
"partyType",
"relativePhysicalStats",
"timeOfDay",
"tradeSpecies",
"turnUpsideDown",
"region",
"usedMove",
"minMoveCount",
"minSteps",
"minDamageTaken",
"allowedNatures",
"conditionExpression"
],
"properties": {
"item": {
"type": [
"string",
"null"
],
"description": "Item used for evolution. Null when unspecified."
},
"gender": {
"type": [
"number",
"null"
],
"description": "Required gender ID. Null when unspecified."
},
"region": {
"type": [
"string",
"null"
],
"description": "Required region. Null when unspecified."
},
"trigger": {
"type": "string",
"description": "Event that triggers this alternative."
},
"heldItem": {
"type": [
"string",
"null"
],
"description": "Required held item. Null when unspecified."
},
"location": {
"type": [
"string",
"null"
],
"description": "Required location. Null when unspecified."
},
"minLevel": {
"type": [
"number",
"null"
],
"description": "Minimum level. Null when unspecified."
},
"minSteps": {
"type": [
"number",
"null"
],
"description": "Minimum steps. Null when unspecified."
},
"usedMove": {
"type": [
"string",
"null"
],
"description": "Move that must be used. Null when unspecified."
},
"isDefault": {
"type": [
"boolean",
"null"
],
"description": "Whether this is the expected main-series evolution for its variety. Null when unspecified."
},
"knownMove": {
"type": [
"string",
"null"
],
"description": "Required known move. Null when unspecified."
},
"minBeauty": {
"type": [
"number",
"null"
],
"description": "Minimum beauty. Null when unspecified."
},
"partyType": {
"type": [
"string",
"null"
],
"description": "Type required in the party. Null when unspecified."
},
"timeOfDay": {
"type": [
"string",
"null"
],
"description": "Required time of day. Empty string is preserved; null when unspecified."
},
"minAffection": {
"type": [
"number",
"null"
],
"description": "Minimum affection. Null when unspecified."
},
"minHappiness": {
"type": [
"number",
"null"
],
"description": "Minimum happiness. Null when unspecified."
},
"minMoveCount": {
"type": [
"number",
"null"
],
"description": "Minimum move uses. Null when unspecified."
},
"partySpecies": {
"type": [
"string",
"null"
],
"description": "Species required in the party. Null when unspecified."
},
"tradeSpecies": {
"type": [
"string",
"null"
],
"description": "Species to trade for. Null when unspecified."
},
"versionGroup": {
"type": [
"string",
"null"
],
"description": "Version group that introduced this method. Null when unspecified."
},
"knownMoveType": {
"type": [
"string",
"null"
],
"description": "Type of a required known move. Null when unspecified."
},
"allowedNatures": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"description": "Allowed nature names. Empty lists are preserved; null when unspecified."
},
"minDamageTaken": {
"type": [
"number",
"null"
],
"description": "Minimum damage taken. Null when unspecified."
},
"turnUpsideDown": {
"type": [
"boolean",
"null"
],
"description": "Whether the device must be upside down. Null when unspecified."
},
"nearSpecialRock": {
"type": [
"boolean",
"null"
],
"description": "Whether proximity to a Moss Rock or Icy Rock is required. Null when unspecified."
},
"needsMultiplayer": {
"type": [
"boolean",
"null"
],
"description": "Whether multiplayer link play is required. Null when unspecified."
},
"evolvedPokemonForm": {
"type": [
"string",
"null"
],
"description": "Resulting form. Null when unspecified."
},
"needsOverworldRain": {
"type": [
"boolean",
"null"
],
"description": "Whether overworld rain is required. Null when unspecified."
},
"conditionExpression": {
"anyOf": [
{
"type": "object",
"required": [
"expression",
"percentageChance",
"variables"
],
"properties": {
"variables": {
"type": "array",
"items": {
"type": "string"
},
"description": "Names of expression variables in upstream order."
},
"expression": {
"type": "string",
"description": "Verbatim upstream RPN condition expression; not evaluated."
},
"percentageChance": {
"type": "number",
"description": "Upstream chance percentage, including zero."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Variable-dependent condition supplied by PokéAPI. Null when unspecified."
},
"requiredPokemonForm": {
"type": [
"string",
"null"
],
"description": "Required starting form. Null when unspecified."
},
"relativePhysicalStats": {
"type": [
"number",
"null"
],
"description": "Required Attack relative to Defense: 1 greater, 0 equal, -1 less. Null when unspecified."
}
},
"description": "One complete alternative evolution method.",
"additionalProperties": false
},
"description": "All alternative methods in upstream order; empty for a base stage. Requirements apply within each method, never across alternatives."
}
},
"additionalProperties": false
}
},
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"id",
"name",
"resolvedFromSpecies",
"heightDm",
"weightHg",
"types",
"stats",
"abilities",
"sprites",
"moves",
"moveCount",
"speciesFlavorText",
"genus",
"captureRate",
"growthRate",
"genderRate",
"isLegendary",
"isMythical",
"evolutionChain",
"varieties",
"generation",
"eggGroups"
]
},
{
"required": [
"error"
]
}
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"id": {
"type": "number",
"description": "PokéAPI Pokémon-record ID. Form IDs are not National Pokédex numbers."
},
"name": {
"type": "string",
"description": "Canonical Pokémon name in hyphenated lowercase."
},
"error": {
"type": "object",
"required": [
"code",
"message"
],
"properties": {
"code": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"examples": [
"not_found"
],
"description": "Machine-readable failure mode. Declared by this tool: `not_found`: The identifier matches no Pokémon record and no species. Other values are possible when a failure originates below the handler."
},
"recovery": {
"type": "object",
"required": [
"hint"
],
"properties": {
"hint": {
"type": "string"
}
},
"description": "Actionable next step for the caller.",
"additionalProperties": {}
},
"retryable": {
"type": "boolean",
"description": "Whether retrying may succeed."
}
},
"additionalProperties": {}
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
}
},
"description": "Present when the call failed. Absent on success.",
"additionalProperties": {}
},
"genus": {
"type": [
"string",
"null"
],
"description": "English genus (e.g. \"Seed Pokémon\"). Null when unavailable."
},
"moves": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"learnMethod",
"levelLearnedAt"
],
"properties": {
"name": {
"type": "string",
"description": "Move name."
},
"learnMethod": {
"type": "string",
"description": "How the move is learned (level-up, machine, egg, tutor)."
},
"levelLearnedAt": {
"type": "number",
"description": "Level at which the move is learned. Zero for non-level-up methods."
}
},
"description": "Move summary entry — name, learn method, and level.",
"additionalProperties": false
},
"description": "Learnable moves (populated when include_moves=true, empty otherwise)."
},
"stats": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"baseStat",
"effort"
],
"properties": {
"name": {
"type": "string",
"description": "Stat name (hp, attack, defense, special-attack, special-defense, speed)."
},
"effort": {
"type": "number",
"description": "Effort value (EV) yield."
},
"baseStat": {
"type": "number",
"description": "Base stat value."
}
},
"description": "Individual base stat entry.",
"additionalProperties": false
},
"description": "Base stats."
},
"types": {
"type": "array",
"items": {
"type": "string"
},
"description": "Type names ordered by slot (e.g. [\"fire\", \"flying\"])."
},
"sprites": {
"type": "object",
"required": [
"frontDefault",
"frontShiny",
"officialArtwork"
],
"properties": {
"frontShiny": {
"type": [
"string",
"null"
],
"description": "Front shiny sprite URL."
},
"frontDefault": {
"type": [
"string",
"null"
],
"description": "Front default sprite URL."
},
"officialArtwork": {
"type": [
"string",
"null"
],
"description": "High-quality official artwork URL."
}
},
"description": "Sprite URLs.",
"additionalProperties": false
},
"heightDm": {
"type": "number",
"description": "Height in decimetres."
},
"weightHg": {
"type": "number",
"description": "Weight in hectograms."
},
"abilities": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"isHidden",
"slot",
"effectText",
"shortEffectText"
],
"properties": {
"name": {
"type": "string",
"description": "Ability name in hyphenated lowercase (e.g. \"overgrow\")."
},
"slot": {
"type": "number",
"description": "Ability slot (1, 2, or 3)."
},
"isHidden": {
"type": "boolean",
"description": "True when this is the hidden ability."
},
"effectText": {
"type": [
"string",
"null"
],
"description": "Full English effect description. Null when unavailable."
},
"shortEffectText": {
"type": [
"string",
"null"
],
"description": "Short English effect description. Null when unavailable."
}
},
"description": "Ability entry with effect text and hidden-ability flag.",
"additionalProperties": false
},
"description": "Abilities with full effect text."
},
"eggGroups": {
"type": "array",
"items": {
"type": "string"
},
"description": "Egg group names."
},
"moveCount": {
"type": "number",
"description": "Total number of learnable moves regardless of include_moves."
},
"varieties": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"isDefault"
],
"properties": {
"name": {
"type": "string",
"description": "Variety/form name (e.g. \"pikachu-alola-cap\")."
},
"isDefault": {
"type": "boolean",
"description": "True for the canonical form."
}
},
"description": "Form or variant entry with name and default flag.",
"additionalProperties": false
},
"description": "All forms and variants of this species."
},
"genderRate": {
"type": "number",
"description": "Gender ratio: -1 genderless, 0 always male, 8 always female, 1–7 fraction (eighths) female."
},
"generation": {
"type": "string",
"description": "Generation introduced (e.g. \"generation-i\")."
},
"growthRate": {
"type": "string",
"description": "Growth rate name (e.g. \"medium-slow\")."
},
"isMythical": {
"type": "boolean",
"description": "True for mythical Pokémon."
},
"captureRate": {
"type": "number",
"description": "Base capture rate (0–255)."
},
"isLegendary": {
"type": "boolean",
"description": "True for legendary Pokémon."
},
"evolutionChain": {
"anyOf": [
{
"$ref": "#/$defs/__schema0"
},
{
"type": "null"
}
],
"description": "Evolution tree rooted at the base species."
},
"speciesFlavorText": {
"type": [
"string",
"null"
],
"description": "Flavor text from the selected (or most recent) game version. Null when none available."
},
"resolvedFromSpecies": {
"type": [
"string",
"null"
],
"description": "Species name the identifier matched when it named no Pokémon record; this dossier is the default variety of that species. Null when the identifier named a Pokémon record directly."
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true
}pokeapi_get_type_matchups — Get Type Matchups
Get the full offensive and defensive type effectiveness breakdown. Provide either a type name (e.g. "fire", "psychic") or a Pokémon identifier (name or PokéAPI Pokémon-record ID; a species name resolves to its default variety). For dual-type Pokémon, the defensive multipliers are correctly composed (e.g. Fire/Flying vs Rock = 4× because both types are weak to Rock). Exactly one of type or pokemon must be provided.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"type": {
"type": "string",
"description": "Type name in lowercase (e.g. \"fire\", \"water\", \"psychic\"). Provide this or pokemon, not both."
},
"pokemon": {
"type": "string",
"description": "Pokémon name or PokéAPI Pokémon-record ID; a species name resolves to its default variety. The server resolves the types automatically. Provide this or type, not both."
}
},
"additionalProperties": false
}{
"type": "object",
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"queryType",
"resolvedTypes",
"resolvedPokemon",
"resolvedFromSpecies",
"offensiveRelations",
"defensiveMatchups",
"composedMultipliers"
]
},
{
"required": [
"error"
]
}
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message"
],
"properties": {
"code": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"examples": [
"not_found",
"invalid_input"
],
"description": "Machine-readable failure mode. Declared by this tool: `not_found`: The type name or Pokémon identifier was not found in PokéAPI. `invalid_input`: Neither type nor pokemon was provided, or both were provided simultaneously. Other values are possible when a failure originates below the handler."
},
"recovery": {
"type": "object",
"required": [
"hint"
],
"properties": {
"hint": {
"type": "string"
}
},
"description": "Actionable next step for the caller.",
"additionalProperties": {}
},
"retryable": {
"type": "boolean",
"description": "Whether retrying may succeed."
}
},
"additionalProperties": {}
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
}
},
"description": "Present when the call failed. Absent on success.",
"additionalProperties": {}
},
"queryType": {
"type": "string",
"description": "How the query was resolved: \"type\" for a direct type query, \"pokemon\" for a Pokémon lookup."
},
"resolvedTypes": {
"type": "array",
"items": {
"type": "string"
},
"description": "The type name(s) the query resolved to."
},
"resolvedPokemon": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "Resolved PokéAPI Pokémon-record ID, including form IDs."
},
"name": {
"type": "string",
"description": "Resolved Pokémon-record name."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Resolved Pokémon record for a pokemon query; null for direct type queries."
},
"defensiveMatchups": {
"type": "object",
"required": [
"weakTo",
"resists",
"immuneTo"
],
"properties": {
"weakTo": {
"type": "array",
"items": {
"type": "string"
},
"description": "Attacking types that deal 2× or more damage."
},
"resists": {
"type": "array",
"items": {
"type": "string"
},
"description": "Attacking types that deal 0.5× or less damage (but not immune)."
},
"immuneTo": {
"type": "array",
"items": {
"type": "string"
},
"description": "Attacking types that deal 0× damage."
}
},
"description": "Defensive matchups — composed correctly for dual-type Pokémon.",
"additionalProperties": false
},
"offensiveRelations": {
"anyOf": [
{
"type": "object",
"required": [
"superEffectiveTo",
"notVeryEffectiveTo",
"noEffectTo"
],
"properties": {
"noEffectTo": {
"type": "array",
"items": {
"type": "string"
},
"description": "Types this type deals 0× damage to (immune)."
},
"superEffectiveTo": {
"type": "array",
"items": {
"type": "string"
},
"description": "Types this type deals 2× damage to."
},
"notVeryEffectiveTo": {
"type": "array",
"items": {
"type": "string"
},
"description": "Types this type deals 0.5× damage to."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Offensive effectiveness (populated for single-type queries; null for dual-type Pokémon where per-type breakdown does not compose cleanly)."
},
"composedMultipliers": {
"type": "object",
"description": "Multiplier (0, 0.25, 0.5, 1, 2, 4) for every attacking type touched by at least one of the resolved defending type(s), including net-neutral 1× entries where a dual type composes to a cancellation (e.g. Fire/Flying vs Ice: 0.5× then 2× = 1×). A type absent from this map relates to neither defending type and also deals 1× damage.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number"
}
},
"resolvedFromSpecies": {
"type": [
"string",
"null"
],
"description": "Species name when it resolved to its default variety; null for direct record or type queries."
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true
}pokeapi_get_move — Get Move
Get move details by name or numeric ID — type, damage class, power, accuracy, PP, priority, target, stat changes, status-effect chance, and full English effect text. Set include_learners=true to include the list of Pokémon that can learn the move. Move names are available from pokeapi_get_pokemon when include_moves=true.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"identifier"
],
"properties": {
"identifier": {
"type": "string",
"description": "Move name in lowercase hyphenated form (e.g. \"flamethrower\", \"close-combat\") or numeric ID as a string."
},
"include_learners": {
"type": "boolean",
"default": false,
"description": "Include the list of Pokémon that can learn this move. Defaults to false as the list can be large."
}
},
"additionalProperties": false
}{
"type": "object",
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"id",
"name",
"type",
"damageClass",
"power",
"accuracy",
"pp",
"priority",
"effectChance",
"effectText",
"shortEffectText",
"target",
"statChanges",
"learnedByPokemon",
"learnersIncluded"
]
},
{
"required": [
"error"
]
}
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"id": {
"type": "number",
"description": "Move ID."
},
"pp": {
"type": [
"number",
"null"
],
"description": "Base PP. Null when unavailable."
},
"name": {
"type": "string",
"description": "Move name in hyphenated lowercase."
},
"type": {
"type": "string",
"description": "Elemental type (e.g. \"fire\")."
},
"error": {
"type": "object",
"required": [
"code",
"message"
],
"properties": {
"code": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"examples": [
"not_found"
],
"description": "Machine-readable failure mode. Declared by this tool: `not_found`: The identifier resolves to no move in PokéAPI. Other values are possible when a failure originates below the handler."
},
"recovery": {
"type": "object",
"required": [
"hint"
],
"properties": {
"hint": {
"type": "string"
}
},
"description": "Actionable next step for the caller.",
"additionalProperties": {}
},
"retryable": {
"type": "boolean",
"description": "Whether retrying may succeed."
}
},
"additionalProperties": {}
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
}
},
"description": "Present when the call failed. Absent on success.",
"additionalProperties": {}
},
"power": {
"type": [
"number",
"null"
],
"description": "Base power. Null for status moves."
},
"target": {
"type": "string",
"description": "Target selection (e.g. \"selected-pokemon\", \"all-opponents\")."
},
"accuracy": {
"type": [
"number",
"null"
],
"description": "Accuracy percentage (0–100). Null for moves that always hit."
},
"priority": {
"type": "number",
"description": "Priority bracket (positive = higher priority, negative = lower)."
},
"effectText": {
"type": [
"string",
"null"
],
"description": "Full English effect description. Null when unavailable."
},
"damageClass": {
"type": [
"string",
"null"
],
"description": "Damage class: physical, special, or status. Null when unavailable."
},
"statChanges": {
"type": "array",
"items": {
"type": "object",
"required": [
"stat",
"change"
],
"properties": {
"stat": {
"type": "string",
"description": "Stat name."
},
"change": {
"type": "number",
"description": "Stat stage change (positive = buff, negative = debuff)."
}
},
"description": "Stat stage change entry — affected stat and magnitude.",
"additionalProperties": false
},
"description": "Stat stage changes caused by this move."
},
"effectChance": {
"type": [
"number",
"null"
],
"description": "Secondary effect chance percentage. Null when not applicable."
},
"shortEffectText": {
"type": [
"string",
"null"
],
"description": "Short English effect summary. Null when unavailable."
},
"learnedByPokemon": {
"type": "array",
"items": {
"type": "string"
},
"description": "Pokémon names that can learn this move (populated when include_learners=true)."
},
"learnersIncluded": {
"type": "boolean",
"description": "True when the learner list was requested, including when no learners are known."
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true
}pokeapi_get_ability — Get Ability
Get ability details by name or numeric ID — full English effect text, short effect text, generation introduced, and the list of Pokémon that have the ability (including hidden-ability flag and slot). Ability names are returned by pokeapi_get_pokemon in the abilities array.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"identifier"
],
"properties": {
"identifier": {
"type": "string",
"description": "Ability name in lowercase hyphenated form (e.g. \"overgrow\", \"speed-boost\") or numeric ID as a string."
}
},
"additionalProperties": false
}{
"type": "object",
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"id",
"name",
"effectText",
"shortEffectText",
"generation",
"pokemon"
]
},
{
"required": [
"error"
]
}
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"id": {
"type": "number",
"description": "Ability ID."
},
"name": {
"type": "string",
"description": "Ability name in hyphenated lowercase."
},
"error": {
"type": "object",
"required": [
"code",
"message"
],
"properties": {
"code": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"examples": [
"not_found"
],
"description": "Machine-readable failure mode. Declared by this tool: `not_found`: The identifier resolves to no ability in PokéAPI. Other values are possible when a failure originates below the handler."
},
"recovery": {
"type": "object",
"required": [
"hint"
],
"properties": {
"hint": {
"type": "string"
}
},
"description": "Actionable next step for the caller.",
"additionalProperties": {}
},
"retryable": {
"type": "boolean",
"description": "Whether retrying may succeed."
}
},
"additionalProperties": {}
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
}
},
"description": "Present when the call failed. Absent on success.",
"additionalProperties": {}
},
"pokemon": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"isHidden",
"slot"
],
"properties": {
"name": {
"type": "string",
"description": "Pokémon name."
},
"slot": {
"type": "number",
"description": "Ability slot (1, 2, or 3)."
},
"isHidden": {
"type": "boolean",
"description": "True when this is the hidden ability for the Pokémon."
}
},
"description": "Pokémon entry with ability slot and hidden-ability flag.",
"additionalProperties": false
},
"description": "Pokémon that have this ability."
},
"effectText": {
"type": [
"string",
"null"
],
"description": "Full English effect description. Null when unavailable."
},
"generation": {
"type": "string",
"description": "Generation in which the ability was introduced."
},
"shortEffectText": {
"type": [
"string",
"null"
],
"description": "Short English effect summary. Null when unavailable."
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true
}pokeapi_get_item — Get Item
Get item details by name or numeric ID — effect text, category, versioned purchase and sell prices, fling power, item attributes (holdable, consumable, etc.), sprite URL, and Pokémon that commonly hold it.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"identifier"
],
"properties": {
"identifier": {
"type": "string",
"description": "Item name in lowercase hyphenated form (e.g. \"choice-specs\", \"leftovers\") or numeric ID as a string."
}
},
"additionalProperties": false
}{
"type": "object",
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"id",
"name",
"category",
"cost",
"prices",
"flingPower",
"effectText",
"shortEffectText",
"attributes",
"heldByPokemon",
"spriteUrl"
]
},
{
"required": [
"error"
]
}
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"id": {
"type": "number",
"description": "Item ID."
},
"cost": {
"type": [
"number",
"null"
],
"description": "Legacy Pokédollar cost when supplied. Null when unavailable; zero is a literal amount. Independent of versioned prices."
},
"name": {
"type": "string",
"description": "Item name in hyphenated lowercase."
},
"error": {
"type": "object",
"required": [
"code",
"message"
],
"properties": {
"code": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"examples": [
"not_found"
],
"description": "Machine-readable failure mode. Declared by this tool: `not_found`: The identifier resolves to no item in PokéAPI. Other values are possible when a failure originates below the handler."
},
"recovery": {
"type": "object",
"required": [
"hint"
],
"properties": {
"hint": {
"type": "string"
}
},
"description": "Actionable next step for the caller.",
"additionalProperties": {}
},
"retryable": {
"type": "boolean",
"description": "Whether retrying may succeed."
}
},
"additionalProperties": {}
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
}
},
"description": "Present when the call failed. Absent on success.",
"additionalProperties": {}
},
"prices": {
"type": "array",
"items": {
"type": "object",
"required": [
"versionGroup",
"currency",
"purchasePrice",
"sellPrice"
],
"properties": {
"currency": {
"type": "string",
"description": "Currency name for both prices."
},
"sellPrice": {
"type": [
"number",
"null"
],
"description": "Sell price in this currency and version group. Null means not sellable; zero is a literal amount."
},
"versionGroup": {
"type": "string",
"description": "Version group these prices apply to."
},
"purchasePrice": {
"type": [
"number",
"null"
],
"description": "Purchase price in this currency and version group. Null means not purchasable; zero is a literal amount."
}
},
"description": "One version and currency price record.",
"additionalProperties": false
},
"description": "All supplied price records in upstream order. Empty when no records are available."
},
"category": {
"type": "string",
"description": "Item category (e.g. \"held-items\", \"medicine\")."
},
"spriteUrl": {
"type": [
"string",
"null"
],
"description": "Item sprite URL. Null when no sprite is available."
},
"attributes": {
"type": "array",
"items": {
"type": "string"
},
"description": "Item attributes (e.g. \"holdable\", \"consumable\", \"usable-in-battle\")."
},
"effectText": {
"type": [
"string",
"null"
],
"description": "Full English effect description. Null when unavailable."
},
"flingPower": {
"type": [
"number",
"null"
],
"description": "Fling move base power when this item is flung. Null if not throwable."
},
"heldByPokemon": {
"type": "array",
"items": {
"type": "string"
},
"description": "Pokémon that commonly hold this item in the wild."
},
"shortEffectText": {
"type": [
"string",
"null"
],
"description": "Short English effect summary. Null when unavailable."
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true
}pokeapi_get_nature — Get Nature
Get nature details — the stat boosted (+10%), stat reduced (-10%), and preferred/disliked berry flavors. Omit the identifier to list all 25 natures at once. Natures are critical for competitive team-building: every non-neutral nature modifies two stats by ±10%.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"identifier": {
"type": "string",
"description": "Nature name (e.g. \"modest\", \"jolly\") or ID 1–25 as a string. Omit to list all 25 natures."
}
},
"additionalProperties": false
}{
"type": "object",
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"natures",
"isListAll"
]
},
{
"required": [
"error"
]
}
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message"
],
"properties": {
"code": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"examples": [
"not_found"
],
"description": "Machine-readable failure mode. Declared by this tool: `not_found`: The identifier resolves to no nature in PokéAPI. Other values are possible when a failure originates below the handler."
},
"recovery": {
"type": "object",
"required": [
"hint"
],
"properties": {
"hint": {
"type": "string"
}
},
"description": "Actionable next step for the caller.",
"additionalProperties": {}
},
"retryable": {
"type": "boolean",
"description": "Whether retrying may succeed."
}
},
"additionalProperties": {}
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
}
},
"description": "Present when the call failed. Absent on success.",
"additionalProperties": {}
},
"natures": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"increasedStat",
"decreasedStat",
"likesFlavor",
"hatesFlavor"
],
"properties": {
"id": {
"type": "number",
"description": "Nature ID (1–25)."
},
"name": {
"type": "string",
"description": "Nature name (e.g. \"modest\")."
},
"hatesFlavor": {
"type": [
"string",
"null"
],
"description": "Berry flavor the Pokémon dislikes. Null for neutral natures."
},
"likesFlavor": {
"type": [
"string",
"null"
],
"description": "Berry flavor the Pokémon prefers. Null for neutral natures."
},
"decreasedStat": {
"type": [
"string",
"null"
],
"description": "Stat reduced by 10%. Null for neutral natures."
},
"increasedStat": {
"type": [
"string",
"null"
],
"description": "Stat boosted by 10%. Null for neutral natures."
}
},
"description": "Nature entry with stat modifiers and flavor preferences.",
"additionalProperties": false
},
"description": "One or all 25 natures depending on whether identifier was provided."
},
"isListAll": {
"type": "boolean",
"description": "True when all 25 natures are returned (no identifier provided)."
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true
}pokeapi_find_pokemon — Find Pokémon
Filter Pokémon by generation, type, regional pokédex, or egg group. Returns names and PokéAPI IDs; every returned name works as a pokeapi_get_pokemon identifier, where a species name resolves to its default variety. At least one of generation, type, pokedex, or egg_group is required; the ones provided are combined with AND logic, and query adds strict token matching on name within them. A call with no category filter, with or without query, returns an empty result and a notice naming the requirement.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"type": {
"type": "string",
"description": "Type name (e.g. \"fire\", \"psychic\"). Filters to Pokémon of this type."
},
"limit": {
"type": "integer",
"default": 50,
"maximum": 9007199254740991,
"description": "Maximum results to return. Positive integer; defaults to 50.",
"exclusiveMinimum": 0
},
"query": {
"type": "string",
"maxLength": 100,
"description": "Strict token match on name. \"chu\" matches \"pikachu\" and \"raichu\". Case-insensitive. At most 100 characters; whitespace separates tokens, and every token must match."
},
"offset": {
"type": "integer",
"default": 0,
"maximum": 9007199254740991,
"minimum": 0,
"description": "Offset into the filtered result set for pagination. Non-negative integer; defaults to 0."
},
"pokedex": {
"type": "string",
"description": "Regional pokédex name (e.g. \"kanto\", \"hoenn\", \"galar\"). Filters to entries in that dex."
},
"egg_group": {
"type": "string",
"description": "Egg group name (e.g. \"monster\", \"fairy\", \"dragon\"). Filters to Pokémon in this egg group."
},
"generation": {
"type": "string",
"description": "Generation name (e.g. \"generation-i\", \"generation-iii\"). Filters to Pokémon introduced in this generation."
}
},
"additionalProperties": false
}{
"type": "object",
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"pokemon",
"totalCount",
"shown",
"appliedFilters"
]
},
{
"required": [
"error"
]
}
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message"
],
"properties": {
"code": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"examples": [
"invalid_filter"
],
"description": "Machine-readable failure mode. Declared by this tool: `invalid_filter`: An unrecognized generation, type, pokédex, or egg-group name was provided. Other values are possible when a failure originates below the handler."
},
"recovery": {
"type": "object",
"required": [
"hint"
],
"properties": {
"hint": {
"type": "string"
}
},
"description": "Actionable next step for the caller.",
"additionalProperties": {}
},
"retryable": {
"type": "boolean",
"description": "Whether retrying may succeed."
}
},
"additionalProperties": {}
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
}
},
"description": "Present when the call failed. Absent on success.",
"additionalProperties": {}
},
"shown": {
"type": "number",
"description": "Number of results in this response."
},
"notice": {
"type": "string",
"description": "Guidance for missing category filters, zero matches, or an offset beyond the results."
},
"pokemon": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "PokéAPI ID: Pokémon record for type-only searches, species record whenever generation, pokedex, or egg_group is present. Form IDs are not National Pokédex numbers."
},
"name": {
"type": "string",
"description": "Pokémon name."
}
},
"description": "Pokémon entry with PokéAPI ID and name.",
"additionalProperties": false
},
"description": "Matching Pokémon entries."
},
"totalCount": {
"type": "number",
"description": "Total matching Pokémon before limit/offset."
},
"appliedFilters": {
"type": "object",
"required": [
"limit",
"offset"
],
"properties": {
"type": {
"type": "string",
"description": "Normalized type filter, when applied."
},
"limit": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Accepted page size, including the default of 50.",
"exclusiveMinimum": 0
},
"query": {
"type": "string",
"description": "Applied lowercase query tokens joined with single spaces. Omitted without a category filter."
},
"offset": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Accepted page offset, including the default of 0."
},
"pokedex": {
"type": "string",
"description": "Normalized pokédex filter, when applied."
},
"egg_group": {
"type": "string",
"description": "Normalized egg-group filter, when applied."
},
"generation": {
"type": "string",
"description": "Normalized generation filter, when applied."
}
},
"description": "Effective nonblank filters and pagination controls for this response.",
"additionalProperties": false
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true
}Prompts
1 advertised
pokeapi_team_builder
Suggest a candidate team around a lead against a Pokémon or type opponent using verified type matchups and base stats. The client executes the tool calls; this prompt does not fetch data or guarantee battle outcomes or game legality.
- lead
- Lead Pokémon name or PokéAPI Pokémon-record ID; retained as a member of the proposed team. (required)
- opponent
- Opponent Pokémon name or record ID, or a type name, according to opponent_kind. (required)
- opponent_kind
- Interpret opponent as one Pokémon (pokemon) or one type (type). (required)
Resources
21 advertised
Bulbasaur (example) — Pokémon Dossier
Pokémon dossier addressable by name or PokéAPI Pokémon-record ID, including forms. A species name with no Pokémon record of its own resolves to the default variety of that species, named in resolvedFromSpecies. Same payload as pokeapi_get_pokemon without move details, including every evolution alternative and its version and form metadata.
pokeapi://pokemon/bulbasaurBulbasaur (PokéAPI ID: 1) — Pokémon Dossier
Pokémon dossier addressable by name or PokéAPI Pokémon-record ID, including forms. A species name with no Pokémon record of its own resolves to the default variety of that species, named in resolvedFromSpecies. Same payload as pokeapi_get_pokemon without move details, including every evolution alternative and its version and form metadata.
pokeapi://pokemon/1Normal type — Type Damage Relations
Type damage relations — offensive and defensive multiplier tables for a given type.
pokeapi://type/normalFire type — Type Damage Relations
Type damage relations — offensive and defensive multiplier tables for a given type.
pokeapi://type/fireWater type — Type Damage Relations
Type damage relations — offensive and defensive multiplier tables for a given type.
pokeapi://type/waterElectric type — Type Damage Relations
Type damage relations — offensive and defensive multiplier tables for a given type.
pokeapi://type/electricGrass type — Type Damage Relations
Type damage relations — offensive and defensive multiplier tables for a given type.
pokeapi://type/grassIce type — Type Damage Relations
Type damage relations — offensive and defensive multiplier tables for a given type.
pokeapi://type/iceFighting type — Type Damage Relations
Type damage relations — offensive and defensive multiplier tables for a given type.
pokeapi://type/fightingPoison type — Type Damage Relations
Type damage relations — offensive and defensive multiplier tables for a given type.
pokeapi://type/poisonGround type — Type Damage Relations
Type damage relations — offensive and defensive multiplier tables for a given type.
pokeapi://type/groundFlying type — Type Damage Relations
Type damage relations — offensive and defensive multiplier tables for a given type.
pokeapi://type/flyingPsychic type — Type Damage Relations
Type damage relations — offensive and defensive multiplier tables for a given type.
pokeapi://type/psychicBug type — Type Damage Relations
Type damage relations — offensive and defensive multiplier tables for a given type.
pokeapi://type/bugRock type — Type Damage Relations
Type damage relations — offensive and defensive multiplier tables for a given type.
pokeapi://type/rockGhost type — Type Damage Relations
Type damage relations — offensive and defensive multiplier tables for a given type.
pokeapi://type/ghostDragon type — Type Damage Relations
Type damage relations — offensive and defensive multiplier tables for a given type.
pokeapi://type/dragonDark type — Type Damage Relations
Type damage relations — offensive and defensive multiplier tables for a given type.
pokeapi://type/darkSteel type — Type Damage Relations
Type damage relations — offensive and defensive multiplier tables for a given type.
pokeapi://type/steelFairy type — Type Damage Relations
Type damage relations — offensive and defensive multiplier tables for a given type.
pokeapi://type/fairypokeapi-guide
Use pokeapi_* tools for form-aware Pokémon discovery, evolution requirements, and type-matchup research. Follow identifier chains and check search coverage and game-version limits before drawing conclusions.
skill://pokeapi-guide/SKILL.mdPokémon Dossier — Pokémon Dossier
Pokémon dossier addressable by name or PokéAPI Pokémon-record ID, including forms. A species name with no Pokémon record of its own resolves to the default variety of that species, named in resolvedFromSpecies. Same payload as pokeapi_get_pokemon without move details, including every evolution alternative and its version and form metadata.
pokeapi://pokemon/{identifier}Type Damage Relations — Type Damage Relations
Type damage relations — offensive and defensive multiplier tables for a given type.
pokeapi://type/{typeName}io.modelcontextprotocol/skills
skill://{+path}90-day uptime
A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.
- 2026-11-07: 1 of 1 checks answered
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 703 ms
- 95th percentile latency
- 703 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 703 ms · metadata changed · 7 tool(s), 21 resource(s), 3 resource template(s), 1 prompt(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http pokeapi-mcp-server-caseyjhand https://pokeapi.caseyjhand.com/mcpCodex
codex mcp add pokeapi-mcp-server-caseyjhand --url https://pokeapi.caseyjhand.com/mcpCursor
{
"mcpServers": {
"pokeapi-mcp-server-caseyjhand": {
"url": "https://pokeapi.caseyjhand.com/mcp"
}
}
}Cline
{
"mcpServers": {
"pokeapi-mcp-server-caseyjhand": {
"type": "streamableHttp",
"url": "https://pokeapi.caseyjhand.com/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"pokeapi-mcp-server-caseyjhand": {
"type": "http",
"url": "https://pokeapi.caseyjhand.com/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http pokeapi-mcp-server-caseyjhand https://pokeapi.caseyjhand.com/mcpClaude Desktop
https://pokeapi.caseyjhand.com/mcpWindsurf
{
"mcpServers": {
"pokeapi-mcp-server-caseyjhand": {
"serverUrl": "https://pokeapi.caseyjhand.com/mcp"
}
}
}Let your agent find its tools
Find servers like pokeapi-mcp-server from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.