A vector embedding and semantic search system for Tana workspace nodes using local BGE embeddings and LanceDB vector store
Critical gaps across all dimensions. Tool definitions exist but lack rigor. Descriptions are present but minimal (10-50 chars, well below 194-char baseline). Input schemas visible but incomplete: search_nodes uses an object-type 'query' parameter with no nested schema definition, violating JSON Schema best practices. No output schemas documented. Parameters lack type constraints and validation guidance. No error handling patterns. Tools appear inferred from code rather than explicitly registered with full MCP metadata. No tool annotations (readOnlyHint, etc.). This server reads from Tana API but does not expose proper MCP tool definitions.
Fetch child nodes of a specific node with optional limit
Fetch all tags from a Tana workspace
Search for nodes in a Tana workspace with query filters and limit
search_nodes 'query' parameter is typed as 'object' with no nested schema. LLM cannot infer valid structure (hasType, onDate, edited). Violates JSON Schema best practices and pattern:constrained-input.
No output schemas documented for any tool. LLMs cannot plan downstream calls or extract required fields (e.g., node IDs for chaining). Violates pattern:tool and pattern:tool-chain.
Descriptions are 10 - 50 characters (well below 194-char baseline). 'Fetch all tags from a Tana workspace' lacks WHEN to use, prerequisites, or return structure. Insufficient for LLM tool selection.
No error handling guidance. Code catches exceptions silently (e.g., 'except: return []' in turbo_index.py). LLM receives no recovery hints on API failures, timeouts, or invalid queries.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 36 | 2026-07-28+ | v2 |
No pagination support. search_nodes accepts 'limit' but no offset/cursor. Large workspaces will truncate results silently, breaking agent reasoning. Violates pattern:paginated-result.