This server defines 13 tools with basic schema coverage but significant quality gaps. Most tools have descriptions (11/13 above 20 chars), but descriptions are terse and lack context about WHEN to use each tool or HOW results chain to downstream operations. Parameter descriptions are minimal or generic. No tool documentation addresses error recovery, idempotency, or safety of destructive operations. The server exposes a functional KV storage interface but lacks the pedagogical depth needed for confident LLM tool selection in multi-step workflows. Key issues: (1) Many parameter descriptions are single words ('Key in KV store') rather than actionable guidance; (2) No output schema documentation, LLMs cannot predict what fields they'll receive; (3) Write/destructive tools lack warnings or confirmation patterns; (4) Tool names are clear but descriptions do not explain composition (e.g., when to use getItem vs getItemRaw vs getMeta); (5) Error handling is silent, tools catch exceptions and log them but return generic 'success' or 'null' without guidance for recovery.
Gets the value of a key in storage
Gets the value of a key in storage in raw format
Gets the value of multiple keys in storage in parallel
Get all keys. Returns an array of strings.If a base is provided, only keys starting with the base will be returned and only mounts starting with base will be queried
Get metadata object for a specific key
Checks if storage contains a key.
Remove a value (and it's meta) from storage
No documented output schemas. Tools return generic text ('success', JSON stringified results) without declaring expected fields, types, or cardinality. LLMs cannot predict what structure they'll receive, forcing them to infer format from results or call tools speculatively.
Destructive/write operations (removeItem, setItem, setItems, setItemRaw, setMeta, removeMeta) lack confirmation or dry-run support. An agent can irreversibly delete data with no chance for the user to review or confirm the action.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 46 | <=2025-11-25 | v2 |
Remove meta for a specific key
Add/Update a value to the storage
Add/Update a value to the storage in raw format
Add/Update items in parallel to the storage
Set custom meta for a specific key
Get an overview of all mount points. Returns a list of objects, each containing 'driverName' and 'base'.
Parameter descriptions are minimal (1-5 words) and do not explain constraints, expected format, or dependencies. E.g., 'Key in KV store' does not describe the key naming convention, max length, or whether wildcards are supported. Per pattern baseline, descriptions should be 50-200 chars and actionable.
Error handling is silent and non-actionable. Tools catch exceptions and log them via server.server.sendLoggingMessage() but return generic 'success' or 'null'. LLMs cannot distinguish recoverable errors (invalid key) from transient failures (connection timeout) and have no guidance on what to do next.
Tool descriptions do not explain composition or disambiguation. Three tools read values (getItem, getItemRaw, getItems) and three write metadata (setMeta, getMeta, removeMeta). Descriptions don't clarify when to use getItem vs getItemRaw, or how getItem chains to getItems for bulk operations.
Write operations (setItem, setItems, setItemRaw) do not document idempotency. Agents retry failed calls, if setItem is not idempotent, retries risk duplicate records or overwriting recent changes. Documentation should state whether repeated calls with same key/value are safe.
Output format inconsistency. getItem and getItemRaw return stringified values ('null' as string, not null), while setItem returns 'success'. getKeys returns JSON array but getItem returns JSON stringified. Inconsistency forces LLMs to parse different formats for related operations.
No pagination support on getKeys(). If the store contains thousands of keys, LLMs cannot retrieve them all, and no indication of whether results are truncated. Per pattern baseline, list-returning tools must support limit/offset and return a total count or next_cursor.
Input schema for setItems uses z.any() for value and options fields, and has a @ts-ignore comment in the implementation. This bypasses type safety and means LLMs have no guidance on what structure is valid for nested values.