Multi-server MCP setup providing tools for chart generation, image generation via ComfyUI, PDF generation, and knowledge management
The server defines 13 tools with mixed quality. Most tools have basic descriptions and input schemas, but critical gaps exist: (1) No error handling guidance for destructive operations (remove_knowledge_* tools), (2) Parameter descriptions are inconsistent and sometimes vague, (3) Output schemas are documented in prose but not in machine-readable JSON Schema format, (4) Tool descriptions lack action verbs and caller guidance, (5) No documentation of tool composition or chaining guidance. The chart_generator and pdf_generator tools have detailed prose descriptions (100-350 chars each, baseline good), but knowledge tools lack context for when to use remove_by_id vs remove_by_name. generate_image lacks quality/time/cost guidance. None of the tools include permission gates or error recovery guidance despite destructive operations.
Add content to the knowledge base from a local file. Args: file_path: Path to the local file (PDF, TXT, DOCX, etc.) name: Optional name for the content (defaults to filename) Returns: Success message with content ID
Add content to the knowledge base from a URL. Args: url: The URL to download and add (PDF, TXT, DOCX, etc.) name: Optional name for the content (defaults to filename) Returns: Success message with content ID
Generate a chart from data. Args: chart_type: Type of chart - "scatter", "line", "bar", "barh", "histogram", "pie", "heatmap", "box", "violin", or "area" data: Data for the chart. Format depends on chart_type: - scatter: {"x": [...], "y": [...]} - line: {"x": [...], "y": [...]} or {"x": [...], "y": [[...], [...]]} for multi-line - bar/barh: {"categories": [...], "values": [...]} - histogram: {"values": [...], "bins": 10} - pie: {"labels": [...], "values": [...]} - heatmap: {"data": [[...]], "xlabels": [...], "ylabels": [...]} - box/violin: {"data": [[group1], [group2]], "labels": [...]} - area: {"x": [...], "y": [[...], [...]]} title: Chart title xlabel: X-axis label ylabel: Y-axis label legend: Legend labels as object with "value" key (e.g. {"value": ["A", "B"]}), empty {} for no legend theme: Color theme - "default", "dark", "light", "colorblind", "pastel", "bold", "monochrome" format: Aspect ratio - "square" (1:1), "landscape" (16:9), "portrait" (9:16) quality: Resolution - "high" (1024px), "medium" (720px), "low" (256px), "very_low" (128px) Returns: Dictionary with: - success: Whether generation succeeded - image_path: Absolute path to the saved chart - image_url: URL for markdown display (HTTP if available, file:// otherwise) - chart_type: The type of chart generated - metadata: Generation parameters
Destructive operations (remove_knowledge_by_id, remove_knowledge_by_name, remove_all_knowledge) lack error handling guidance, confirmation mechanisms, or permission gates. The description for remove_all_knowledge is only 33 chars ('Remove all content from the knowledge base. Also removes all vectors and local files. Returns: Success or error message') and provides no recovery path if called mistakenly.
List tools (list_chart_types, list_themes, list_generated_images, list_generated_pdfs, list_knowledge_contents) have descriptions under 50 chars. 'List all supported chart types...' and 'List all available themes...' and 'List recently generated images' lack context for WHEN or WHY to call them.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 53 | <=2025-11-25 | v2 |
| 2026-03-09 | D | 50 | - | v1 |
Generate an image from a text prompt using ComfyUI. Args: prompt: Text description of the image to generate aspect_ratio: Image dimensions - "square" (1024x1024), "landscape" (1280x768), "portrait" (768x1280), "wide" (1536x640), "tall" (640x1536) quality: Generation quality - "draft" (5 steps), "normal" (9 steps), "high" (15 steps) seed: Random seed for reproducibility (optional, random if not provided) Returns: Dictionary with: - success: Whether generation succeeded - image_path: Absolute path to the saved image - image_url: URL for markdown display (HTTP if available, file:// otherwise) - prompt: The prompt used - metadata: Generation parameters (seed, dimensions, steps) Examples: - Simple: prompt="A cat sitting on a windowsill" - Detailed: prompt="A majestic lion in the savanna at sunset, golden hour lighting" - With options: prompt="Forest landscape", aspect_ratio="wide", quality="high"
Generate a PDF from Markdown content. Args: content: Markdown content to convert title: Document title (shown on cover page) author: Author name (shown on cover page) date: Date (defaults to today if not specified) cover_page: Include a centered cover page with title/author/date toc: Include table of contents style: Visual style - "default", "academic", "modern", or "minimal" paper_size: Paper size - "a4", "letter", or "legal" font_size: Font size - "10pt", "11pt", or "12pt" Supports: - Headings (# ## ###) - Lists (- * 1.) - Tables (| col1 | col2 |) - Images () - Code blocks (``` or indentation) - Math formulas ($inline$ or $$block$$) - Links, bold, italic, etc. Returns: Dictionary with: - success: Whether generation succeeded - pdf_path: Absolute path to the saved PDF - pdf_url: File URL for opening the PDF - title: Document title - metadata: Generation parameters
List all supported chart types with their data format requirements. Returns: Dictionary with: - chart_types: Map of chart type to its specification (required fields, optional fields, description, example)
List recently generated images.
List recently generated PDFs.
List all content in the knowledge base.
List all available themes with their characteristics.
Remove all content from the knowledge base. Also removes all vectors and local files. Returns: Success or error message
Remove content from the knowledge base by its ID. Also removes associated vectors and local files. Args: content_id: The ID of the content to remove Returns: Success or error message
Remove content from the knowledge base by its name. Also removes associated vectors and local files. Args: name: The name of the content to remove Returns: Success or error message
Output schemas documented only in prose, not in JSON Schema format. The generate_chart, generate_image, and generate_pdf tool descriptions include textual return specifications ('Dictionary with: success, image_path, image_url...'), but these are not machine-readable. LLMs cannot reliably parse prose schemas to infer what fields to expect in downstream calls.
Knowledge tool set lacks clarity on mutual exclusivity and use cases. add_knowledge_from_url, add_knowledge_from_file, remove_knowledge_by_id, remove_knowledge_by_name are all separate tools, but no guidance on: (1) when to use file vs URL, (2) how to decide between ID vs name removal, (3) what data add_knowledge returns (content_id? name?). Undocumented dependencies force LLM to infer correct invocation.
generate_image parameter 'seed' has default null but accepts integer. No documentation of: (1) range of valid seed values, (2) whether null produces random vs deterministic output, (3) time/cost implications of quality levels (draft=5 steps, normal=9, high=15). LLMs cannot optimize without this info and may pass invalid seeds.
No error recovery guidance in any tool description. E.g., generate_image returns 'success: Whether generation succeeded', but does not specify: (1) what errors are retryable (timeout, quota), (2) what errors are user-fixable (bad prompt), (3) how to interpret failure reasons.
Tool names lack consistent action verbs for list tools. 'list_chart_types', 'list_themes', 'list_generated_images', 'list_generated_pdfs', 'list_knowledge_contents' all use 'list', but discovery tools should indicate what they reveal. No distinction between 'list available' (pre-generation guidance) and 'list completed' (historical). LLM may confuse list_chart_types (configuration discovery) with list_generated_charts (does not exist).