Multi-server MCP deployment for TricorderKit: vault-search (semantic RAG via Qdrant+Ollama) and graph-server (Neo4j+Qdrant knowledge graph)
Mixed quality across 5 tools. All tools have descriptions (10-100 chars, mostly adequate) and input schemas with types. However, schemas lack depth: parameter descriptions are minimal or absent in several tools (graphify_ping has empty input {}; graphify_store/relate/retrieve descriptions are terse). No output schemas documented. Error handling guidance is absent. Tool naming is verb-noun compliant but generic (graphify_* prefix adds little semantic value). Composition is reasonable, tools chain well (retrieve → store → relate), but lack idempotency guarantees and recovery guidance. No tool annotations (readOnlyHint/destructiveHint) despite clear risk levels. STDIO transport caps protocol readiness at 50.
Vérifie la connectivité de Neo4j et Qdrant.
Crée une relation typée entre deux nœuds Neo4j. Idempotent (MERGE).
Requête hybride Neo4j + Qdrant, résultats fusionnés par score.
Écrit un nœud dans Neo4j ET génère son embedding dans Qdrant. Idempotent (MERGE sur id).
Recherche semantique dans le vault de connaissance (RAG dense).
graphify_ping has empty input schema ({}). No parameters documented. Violates pattern:tool-description, every parameter needs a description.
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.
No tool annotations (readOnlyHint/destructiveHint/idempotentHint) despite clear risk levels (graphify_store and graphify_relate are WRITE; others READ_ONLY). Agents cannot infer safety or retry semantics.
No error handling guidance. Tools lack recovery hints (e.g., 'If Neo4j is unreachable, check NEO4J_URI env var'). Violates pattern:recovery-guide.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | <=2025-11-25 | v2 |
Parameter descriptions are minimal. E.g., graphify_store 'id' says 'Identifiant unique' but lacks format constraints (lowercase, hyphens only). graphify_retrieve 'min_score' lacks range context (0-1 is stated but not validated). Violates pattern:constrained-input.