A FastAPI-based server for vector database operations using Pinecone and sentence transformers for embedding generation and semantic search
VectorDB MCP server has basic tool definitions but significant quality gaps. All three tools have descriptions and input schemas, but descriptions are generic (avg 95 chars, below 194-char baseline), parameter descriptions lack detail, and output schemas are undocumented. No error handling guidance, no parameter constraints (enums, ranges), and no security considerations for API key injection. Tool naming is acceptable (verb_noun pattern) but lacks clarity on when to use each tool vs alternatives. The upsert_vectors tool generates IDs internally (str(i)) rather than accepting user-provided identifiers, limiting composability.
Check the health status of the server and Pinecone connection
Search for similar vectors in Pinecone index. Generates embedding from query text and returns top-k matching results with metadata
Upsert vectors to Pinecone index. Generates embeddings from input texts and stores them with optional metadata and namespace
Output schemas undocumented. VectorResponse and SearchResponse models exist in code but are not exposed in tool definitions. LLMs cannot plan downstream calls or extract required fields (e.g., vector IDs for follow-up operations).
Parameter descriptions lack actionable detail. 'Optional namespace for organizing vectors' does not explain format, constraints, or when to use it. 'Optional metadata dictionary' does not specify allowed keys, value types, or size limits.
No error handling guidance. Exceptions are caught and returned as error strings, but LLMs receive no recovery hints. E.g., 'Pinecone connection failed' does not suggest retry, check credentials, or fallback actions.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 48 | 2026-07-28+ | v2 |
API key exposed in environment. PINECONE_API_KEY and PINECONE_ENV are read from os.getenv() at module load time, not injected per-request. If this server is compromised, credentials are accessible to all callers.
No input validation or constraints. top_k accepts any integer (no min/max). texts array has no length limit. namespace and metadata accept any string/object. LLMs can pass absurd values (top_k=1000000, texts with 10MB strings) causing timeouts or OOM.