Wraps the Gelbooru API to search posts, fetch character tags, and generate image generation prompts from Gelbooru metadata
The Gelbooru MCP server demonstrates basic tool structure but suffers from significant gaps in documentation and schema completeness. All three tools have descriptions and parameters with types, but critical deficiencies in parameter descriptions, output schema documentation, and error guidance prevent higher scores. The server is functional for read-only Gelbooru queries but falls short of production-grade quality standards. Parameter descriptions lack actionable detail (format, ranges, constraints), and output schemas are not formally documented. Error handling exists but lacks recovery guidance for the LLM. The codebase shows reasonable code organization and caching logic, but the MCP interface itself needs substantial improvement to support reliable agent integration.
Build an image-generation prompt from character tags. Combines character name and top tags (eye, hair, other) into a comma-separated string suitable for Stable Diffusion, DALL-E, etc.
Fetch and analyze tags for a character across multiple Gelbooru posts. Returns top tags split into eye, hair, and other categories.
Search Gelbooru posts by tags, page, limit, or ID. Supports all Gelbooru search operators.
Output schemas not documented. Tools return complex nested objects (character_tags returns eye/hair/other tag categories with count/frequency; build_prompt returns a prompt string) but the MCP tool definitions do not declare output schema structure. LLMs cannot plan downstream operations or extract required fields without documented return types.
Parameter descriptions lack actionable constraints and format specifications. 'limit' (1-100, default 50) is mentioned in the description text but not enforced in schema. 'pid' (page ID, 0-indexed) lacks minimum/maximum bounds in schema. 'tags' accepts 'Gelbooru operators like rating:general, solo, etc.' but does not list valid operators or syntax. LLMs cannot validate inputs without formal constraints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 46 | 2026-07-28+ | v2 |
Error handling lacks recovery guidance. The _get() function returns {'error': str(exc)} or {'raw': raw} on failure, but error responses do not guide the LLM on next steps. No indication of retryability (transient vs. fatal). No suggestion for alternative tools or parameters. Per pattern:recovery-guide, errors should tell the agent what to do next.
No pagination or result limit enforcement in search_posts schema. Gelbooru API returns a hard cap of 100 posts per request, but the tool accepts 'limit' without a documented maximum. If an LLM requests limit=500, the tool silently caps at 100. No pagination cursor or next_page indicator returned. Per pattern:paginated-result, tools returning lists must accept limit/offset and return total count or next_cursor.
'max_images' parameter in character_tags and build_prompt lacks bounds in schema. Description mentions 'capped at 500' but schema does not enforce minimum=1 or maximum=500. LLM could pass negative or zero values, causing silent failures. Per pattern:constrained-input, enum/numeric constraints must be in schema, not just description text.
Tool descriptions conflate implementation details (caching, API pagination, tag filtering) with user-facing intent. 'character_tags' description: 'Fetch and analyze tags for a character across multiple Gelbooru posts. Returns top tags split into eye, hair, and other categories.', the second sentence describes output, but output schema is not formally declared in the MCP definition. Per pattern:tool-description, descriptions should state WHAT, WHEN to use, and WHAT is returned, but formal output schema must exist separately.
Tool naming uses action verbs appropriately (search_, character_, build_) but 'character_tags' is ambiguous, does it return tags FOR a character, or tags ABOUT a character? Per name-clarity baseline, 'character_tags' should be 'get_character_tags' or 'analyze_character_tags' to make the action explicit. Current name could confuse with a hypothetical 'set_character_tags' or 'character_tags_list'.