MCP server for managing personal assets (images for blog posts, articles, etc.) in Vercel Blob storage
Five tools with clear naming and reasonable descriptions, but multiple schema and documentation gaps reduce overall quality. Tool names follow verb_noun pattern (assets_upload, assets_list, etc.), which is good. Descriptions are moderately detailed (avg ~100 chars) and mention the primary action. However, parameter descriptions lack specificity around constraints and formats. No output schemas are documented for the response structure (what fields the agent receives). Error handling exists but is minimal, no recovery guidance or actionable error messages. Parameters mostly have type definitions but lack constraints (e.g., limit 1-1000, no documentation of what happens when limit is omitted). No tool annotations (readOnlyHint/destructiveHint) visible despite multiple destructive operations (delete, copy). Security: credentials properly injected via environment variable (BLOB_READ_WRITE_TOKEN), which is correct. Composition is sound, tools are single-purpose and chainable, but response documentation would improve usability.
Copy an asset to a new path in your personal assets store
Delete one or more assets from your personal assets store
Get metadata of a specific asset by its URL (size, content type, upload time, etc.)
List files in your personal assets store with optional prefix filtering and pagination
Upload a local file to your personal assets store (for blog posts, articles, etc.) and return the public URL
Output schemas not documented. No response structure provided for any tool. LLM cannot infer what fields (url, size, metadata, etc.) are returned by assets_upload, assets_list, assets_head. Breaks planning for downstream tool chaining.
Missing tool annotations (destructiveHint, readOnlyHint). assets_delete and assets_copy perform destructive/write operations but lack explicit destructiveHint annotations. Agents cannot distinguish safe read-only operations from irreversible mutations without this metadata.
Parameter constraints not documented. 'limit' parameter accepts a number but no min/max range is specified. Baseline rubric requires: 'Specify minimum and maximum for numeric parameters (e.g. page_size 1 - 100).' assets_list description states default 1000, max 1000, but this is in the description text, not in schema constraints (no minimum specified, no explicit max enforcement visible in code for other numeric params).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 51 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 55 | - | v1 |
Error messages lack recovery guidance. Input validation errors are raised (e.g., 'localPath is required and must be a string') but do not suggest next steps or alternatives. Per pattern:recovery-guide, errors should tell the agent what to do: 'localPath is required and must be a string. Provide an absolute file path.'
Missing idempotency documentation. assets_upload and assets_copy accept optional path parameters (pathname, toPathname). If the LLM retries with the same localPath but different pathname, it creates a new file. No documentation of whether these operations are idempotent or what happens on collision.