A MCP server project for managing documents in a Chroma vector database with semantic search capabilities
This server has moderate definition quality with complete JSON schemas for all 6 tools and present descriptions. However, there are significant gaps: (1) Parameter descriptions are entirely missing, the schema shows types and constraints but provides no guidance to LLMs about what each parameter controls or how to use it; (2) Output schemas are undocumented, callers cannot see what fields will be returned; (3) Tool descriptions are generic and brief (18-44 chars), falling below the 50-200 char LLM-optimized baseline; (4) No error handling guidance, the server catches exceptions but does not return actionable recovery steps to the LLM; (5) Parameter naming uses '_' conventions but lacks human-friendly alternatives (e.g., document_id only, no content search by name); (6) Metadata filtering is underdocumented and complex (build_where_clause logic is opaque to the LLM). The schemas themselves are well-formed (proper JSON Schema with types, constraints, required fields), which prevents a lower score, but the absence of parameter and output documentation significantly limits LLM usability. This is a C+ server: schemas present and valid, but descriptions underspecified.
Create a new document in the Chroma vector database
Delete a document from the Chroma vector database
List all documents in the Chroma vector database with pagination
Retrieve a document from the Chroma vector database by its ID
Search for documents similar to a query using vector similarity
Update an existing document in the Chroma vector database
Zero parameter descriptions across all tools. Every tool's schema lists parameter types but provides no guidance on what each parameter does, what values are valid, what format is expected, or when to use it. LLMs must guess parameter intent from names alone, leading to misuse.
Output schemas completely undocumented. No tool declares what fields will be returned. Callers (LLMs and downstream agents) cannot anticipate response structure, forcing them to either guess or make exploratory calls.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 51 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 23 | - | v1 |
Descriptions are under 50 characters and lack LLM-optimized detail. Baseline for LLM-friendly descriptions is 50-200 chars with explicit guidance on when/why to use the tool. Current descriptions are brief and generic ('Create a new document' vs. 'Create a new document and automatically generate embeddings for vector similarity search. Use this to add searchable content to the knowledge base.').
No error handling guidance. When a tool fails (e.g., document not found, invalid filter), the server catches exceptions but returns only the error type/message. No actionable recovery steps (e.g., 'Document not found. Try search_similar() first to find matching documents' or 'Invalid filter. Metadata keys must match existing document metadata').
delete_document lacks confirmation/dry-run pattern for an irreversible operation. Agents should be able to preview what would be deleted or confirm before execution. Currently, a single LLM call deletes permanently with no undo path.
Metadata filtering is undocumented and complex. search_similar accepts metadata_filter and content_filter parameters, but the schema provides no guidance on filter syntax. Code shows build_where_clause() logic, but LLMs cannot infer Chroma filter syntax from a free-form 'object' schema. This invites malformed filters and failures.
list_documents violates pagination pattern. It accepts limit/offset but the response schema is undocumented. Pagination should return total count or next_cursor alongside items so LLMs can iterate correctly. Without response schema, LLM cannot tell if it receives 10 items, 10 total, or something else.
Tool names lack human-friendly resolution. All tools accept document_id only, no support for content-based lookup, name, or tag. If a user wants to 'find the document about vector databases,' they must call search_similar() as a discovery step, then use read_document with the returned ID. A higher-level tool accepting 'topic' or 'description' parameter would be more agent-friendly.