This server exhibits critical gaps across nearly all quality dimensions. Tool names are generic and lack clear action verbs. Descriptions are minimal and non-descriptive (all 1 - 20 chars). Input schemas are either completely missing or severely incomplete. No parameter descriptions visible. Error handling is absent. The server appears to be a local proof-of-concept rather than a production-ready MCP server. Six tools are defined but only two have any schema information visible, and those schemas are minimal.
Tools (6)
get_backpacksread onlyauthsource verified17/100
Gets backpacks
get_emotesread onlyauthsource verified17/100
Gets emotes
get_items_by_idread onlyauthsource verified52/100
Gets all items from the profile that match the template_id
get_pickaxesread onlyauthsource verified17/100
Gets pickaxes
get_profileread onlyauthsource verified47/100
Factory function to instantiate and return a profile object of the specified type
Four tools (get_skins, get_backpacks, get_pickaxes, get_emotes) have trivial descriptions ('Gets X') under 20 characters. These provide no context for LLM tool selection and violate the 10 - 1024 character baseline.
No output schemas are documented for any tool. LLMs cannot plan downstream calls or extract data when return types are undefined. Production tools document all output schemas.
Expand descriptions for get_skins, get_backpacks, get_pickaxes, get_emotes to 50 - 150 chars. Example: 'get_skins: Returns all cosmetic character skins owned by the player in their Athena (Battle Royale) profile. Each skin has an ID and attributes like rarity and unlock date. Call this to display the player\'s skin collection.'
Define input schemas for all six tools. At minimum, specify parameter types (string, integer, enum) and add descriptions explaining what each param does. See get_items_by_id for a baseline.
Add parameter descriptions to get_profile. Explain: account_id = Epic Games user ID (36-char hex string); bearer_token = OAuth token from Epic Games API (now moved to server-side secret injection); profile_type = one of: Athena (Battle Royale), Creative, Campaign, CommonCore.
Move bearer_token from a tool parameter to server-side secret injection. Store the token in an environment variable (e.g. FORTNITE_BEARER_TOKEN) and read it inside the tool implementation. Never expose secrets in tool params.
Document output schemas for all tools. Example: 'get_skins returns an array of {id: string, attributes: object}. The attributes object contains rarity, unlockSource, and other cosmetic metadata.' Include this in the tool description or a separate schema definition.
Add error handling and recovery guidance. In get_profile, if the HTTP request to Epic Games API fails, return a structured error like: '{"error": "Authentication failed", "code": "INVALID_BEARER", "recovery": "Verify the bearer token is valid and has not expired."}' instead of raising an unhandled exception.
No error handling patterns visible. Tools make external HTTP calls to Epic Games API (see QueryProfile.__download_profile) but provide no guidance on retry, timeout, or user-fixable errors.
Bearer token is exposed as a tool parameter in get_profile(). Credentials must never appear in parameters, they log to traces and agent history. Use server-side secret injection via environment variables.
Parameter 'profile_type' uses a ProfileType enum, but the enum definition is in a separate file (ProfileTypes.py) and no description explains when/why to use each profile type or what data each contains.
Four tools (get_skins, get_backpacks, get_pickaxes, get_emotes) are wrappers around get_items_by_id() with hardcoded template IDs. These should either be removed (DRY) or documented to explain why separate tools exist instead of a single parameterized tool.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) present. All tools are READ_ONLY per spec, but this is not signaled to LLM clients via tool metadata.
Consider consolidating get_skins, get_backpacks, get_pickaxes, get_emotes into a single 'get_items(item_type: enum)' tool to reduce redundancy and simplify the tool surface. If separate tools are desired, document why (e.g. for convenience or usage analytics).
Add readOnlyHint=true to all tool definitions to signal that these are safe read-only operations with no side effects.
Add pagination support to get_items_by_id. If the profile contains many items, split results into pages (limit, offset, total_count) to avoid exhausting the LLM context window.
Validate input types before calling downstream APIs. For example, in get_profile, check that account_id is a 36-char hex string and profile_type is one of the four valid enum values. Return clear error messages if validation fails.