MCP server for storing and retrieving feature vectors with metadata in a SQLite database
FeatureStoreLite has 3 tools with basic action verbs (store_, get_, list_) but suffers from significant quality gaps. Tool descriptions are present but generic and boilerplate-heavy ('Tool: ...' prefix followed by minimal explanation). Parameters are typed but lack rich descriptions, the 'vector' parameter in store_feature only says 'A valid JSON array string' without explaining the domain semantics (dimensions, normalization, expected range). The 'metadata' parameter has no description at all in the schema. No output schemas are documented, forcing LLMs to guess response structure. Error handling is minimal (raw exception strings). The store_feature tool accepts a JSON string parameter instead of structured input, which is unusual for vector storage. No per-tool risk annotations (readOnlyHint, destructiveHint, idempotentHint) are present. Overall, this reads as a minimal working implementation rather than a production-grade tool suite.
Tool: Retrieve a feature vector by key.
Tool: List all available feature keys.
Tool: Store a feature vector. Tools are executable functions that LLMs can call to perform actions.
Generic, boilerplate descriptions across all tools. Descriptions begin with 'Tool: ' and immediately state the obvious (e.g., 'Store a feature vector'), omitting domain context, use cases, and selection criteria.
Missing parameter descriptions in schema. 'metadata' parameter in store_feature has required=false in schema but NO description field. 'key' in get_feature says 'unique identifier' but does not explain the naming convention or how to discover keys.
No documented output schemas. Tools return plain JSON strings; LLMs must infer response structure from code comments. get_feature returns {key, vector, metadata}; list_features returns []; store_feature returns string. None of these are formally specified in a schema section.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 44 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 38 | - | v1 |
list_features accepts no pagination parameters (limit, offset, cursor) and returns all features without a count or next cursor. Large feature stores could overwhelm the context window with no way to paginate.
store_feature lacks idempotency documentation. Code uses INSERT OR REPLACE, which is idempotent, but this behavior is not declared in the tool description or via an idempotentHint annotation. LLMs cannot determine if retries are safe.
Error messages are minimal and non-actionable. store_feature returns raw exception strings ('Error: {str(e)}') which give LLMs no guidance on retry or recovery. get_feature returns plain 'not found' text instead of suggesting available keys.
Vector parameter accepts a JSON string instead of structured array input. Requiring 'vector' as a serialized string ("[0.1, 0.2]") is unusual and forces client-side serialization. Better: accept a structured 'vector' field of type 'array[number]'.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) present in schema definitions. While risk fields are declared in the scan results, the schema definitions in the source do not show any Arcade annotation extensions.