MCP server for the Giphy API -- search, trending, and random GIFs as tools for AI coding agents
Server has 5 tools with complete input schemas and descriptions. Naming follows verb_noun convention (search_gifs, get_trending_gifs, get_random_gif, get_gif_by_id, translate). Descriptions are present and moderately detailed (100-200 chars typical). However, parameter descriptions embed example values (e.g., 'e.g. "funny cats"', 'e.g. "xT9IgzoKnwFNmISR8I"'), which violates LLM best practices, LLMs tend to reuse examples literally. Rating parameters lack enum constraints despite having fixed valid values ('g', 'pg', 'pg-13', 'r'). Output schema is not documented, responses are JSON strings without declared field structure. Error handling uses generic JSON error wrapping without recovery guidance. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite all tools being read-only.
Get a specific GIF by its Giphy ID. Args: gif_id: The Giphy GIF ID (e.g. "xT9IgzoKnwFNmISR8I").
Get a random GIF from Giphy, optionally filtered by tag. Args: tag: Tag to limit random results (e.g. "cats", "happy"). Optional. rating: Content rating filter: "g", "pg", "pg-13", or "r" (default "g").
Get currently trending GIFs on Giphy. Args: limit: Max number of results to return (default 10, max 50). offset: Results offset for pagination (default 0). rating: Content rating filter: "g", "pg", "pg-13", or "r" (default "g").
Search for GIFs on Giphy. Args: query: Search query term or phrase (e.g. "funny cats", "thumbs up"). limit: Max number of results to return (default 10, max 50). offset: Results offset for pagination (default 0). rating: Content rating filter: "g", "pg", "pg-13", or "r" (default "g"). lang: Language code (default "en").
Translate a word or phrase to the perfect GIF using Giphy's WeirdnesS algorithm. This is Giphy's special "translate" endpoint that converts a term into the single most relevant GIF. Great for reactions and responses. Args: term: Term or phrase to translate (e.g. "excited", "oh no"). rating: Content rating filter: "g", "pg", "pg-13", or "r" (default "g").
Rating parameter lacks enum constraint. Valid values ('g', 'pg', 'pg-13', 'r') are documented in description text but not declared as JSON Schema enum. LLMs cannot parse text constraints reliably and may hallucinate invalid values.
Parameter descriptions embed example values (e.g., 'e.g. "funny cats"', 'e.g. "xT9IgzoKnwFNmISR8I"'). LLMs frequently reuse example values literally in real calls, causing failures. Replace examples with formal constraints (enums, patterns, length limits).
Output schema not documented. Tools return JSON strings with _format_gif() helper, but the structure of returned fields (id, title, url, images.original.url, etc.) is not declared in tool output documentation. LLMs cannot plan downstream calls without knowing response structure.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
Error handling returns generic JSON error wrapper without recovery guidance. _handle_errors() catches all exceptions and returns {'error': type, 'message': str, 'traceback': ...}. LLMs receive no actionable next steps (e.g., 'Try search_gifs() with a simpler query' or 'Check GIPHY_API_KEY is set').
No tool annotations. All 5 tools are read-only (risk: READ_ONLY), but readOnlyHint is not set in tool definitions. Tool annotations enable agents to reason about safety and retry logic.