A graph database server with MCP (Model Context Protocol) support for managing topics, nodes, edges, and graph queries
oh-my-graph provides 10 tools with complete input schemas and descriptions. Naming follows verb_noun convention (list_, get_, read_, search_, write). Descriptions are substantive (50-200 chars) and include usage guidance. However, output schemas are undocumented, LLMs cannot predict response structure for chaining. Error handling is absent from visible code. Parameters lack enums for constrained values (e.g., sort direction, match mode, direction). No tool annotations (readOnlyHint/destructiveHint). The write tool accepts arbitrary node/edge arrays without validation guidance. Overall solid foundation but missing production-grade output documentation and error recovery patterns.
Get topic metadata including the last cursor, node count, and edge count
List the most-used node tags and their node counts for exact-tag discovery
List all available topics
Get a node's neighbors via BFS traversal (default depth 1, both directions, all edge types); returns summary-level nodes with hop distance and connecting edge — use for graph-local relevance expansion before read_node
Surface the most-connected nodes for query-independent cold-start exploration; select relevant anchors, then use neighbors for graph-local context and read_node for full details
Get a node's full data along with all its edges (incoming and outgoing)
Output schemas undocumented. LLMs cannot predict response structure (fields, types, pagination) for downstream tool chaining. Breaks pattern:tool-chain and pattern:response-shaper.
Constrained parameters lack enums. sort (ascending|descending), direction (in|out|both), match (all|any) are free-form strings. LLMs will hallucinate invalid values. Violates pattern:constrained-input.
No error handling guidance in code. Errors return raw JSON-RPC codes (-32602, -32601) with minimal context. LLMs cannot determine if errors are retryable or user-fixable. Violates pattern:recovery-guide and pattern:error-classification.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Read node summaries by cursor position, oldest-first by default. For cold starts on large topics, use read_nodes_since_date instead.
Read node summaries added on or after a date. Recommended for cold-start reads on large topics.
Find newest nodes by exact flat tags; use match=all for AND or match=any for OR, then expand relevant results with neighbors
Write nodes and/or edges to a topic; creates the topic if it does not exist
write tool accepts arbitrary node/edge arrays without validation or dry-run. No confirmation step for destructive operations. Violates pattern:confirmation-request.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe reads from destructive writes without parsing descriptions. Violates current MCP spec (2026-07-28) tool annotation requirement.