MCP server for managing portfolio content with read/write operations on structured content items
Folionaut has well-structured tool definitions with comprehensive Zod schemas and descriptions. All 7 tools have clear descriptions (100-200 chars), all parameters are typed and described, and input schemas are properly defined in src/validation/tool.schemas.ts. However, there are notable gaps: (1) output schemas are not documented, the source shows input schemas but no return type documentation; (2) error handling is not evident in the visible code, no recovery guidance or error categorization patterns; (3) the tool descriptions lack context about when to use each tool vs. similar ones (e.g., get_content vs. search_content); (4) no pagination metadata returned (e.g., total count, next_cursor) for list_* tools despite accepting limit parameters; (5) tool risk levels are marked (READ_ONLY, WRITE, REVERSIBLE, DESTRUCTIVE) but tool annotations (readOnlyHint, destructiveHint, idempotentHint) are not visible in the registration code. The server scores well on naming clarity (verb_noun pattern for all tools) and parameter constraints (enums, min/max bounds), but falls short on output structure, error recovery, and tool composition completeness.
Create a new content item with specified type, data, and optional metadata
Delete a content item by its ID
Retrieve a specific content item by its slug identifier
List content items by type with optional status filtering and pagination
List all available content types in the system
Search content across all types using a query string with optional type filtering
Update an existing content item's fields including slug, data, status, and sort order
Output schemas not documented. Tool descriptions define inputs but do not specify what fields or structure are returned. LLMs cannot plan downstream tool calls without knowing return types.
No error handling guidance in visible code. Tools do not provide recovery hints (e.g., 'Resource not found. Try search_content() with a partial query.'). Agents have no direction on what to do if a call fails.
list_content and search_content accept limit parameters but descriptions do not mention pagination structure. No indication if results include total_count, next_cursor, or how to fetch more pages. Agents cannot handle large result sets.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 55 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 39 | - | v1 |
Tool annotations (readOnlyHint, destructiveHint, idempotentHint) are marked in the SERVER metadata but not visible in tool registration code. Risk levels exist (READ_ONLY, DESTRUCTIVE) but are not encoded in the MCP protocol as tool annotations.
Descriptions lack context about when to use similar tools. get_content vs. search_content both retrieve content but distinction is not clear in descriptions. LLMs may pick the wrong tool.
delete_content description does not warn that deletion is irreversible or suggest a confirmation pattern. Agents may delete critical content without user approval.
create_content and update_content accept a generic 'data' object (additionalProperties: true). No validation rules, schema hints, or constraints are documented. LLMs must guess what fields are valid for each content type.