MCP-native realtime graph workspace for AI co-exploration
VisualizeBetter demonstrates solid tool design with 22 well-named, verb-prefixed tools (list_, get_, push_, update_, apply_, add_, find_, clear_, focus_, save_, load_). All tools have descriptions (avg ~80 chars, within 10-1024 range). Input schemas are present and typed for all tools. However, output schemas are not documented in the source code, responses are inferred from implementation. Error handling is present but generic (ToolError). Tool descriptions are functional but lack LLM-optimized guidance on WHEN to use each tool vs. alternatives. Parameter descriptions are adequate but some lack constraint details (e.g., 'max 1000' stated but no validation guidance). No tool annotations (readOnlyHint/destructiveHint) visible despite clear risk stratification (READ_ONLY, WRITE, DESTRUCTIVE). Composition is strong: tools chain well (e.g., list_nodes → get_node → get_neighbors). Naming is consistent and unambiguous.
Add a screen-space annotation (note) at a specific viewport coordinate
Apply visual styling (color, size, border) to nodes or edges
Clear all nodes, edges, and findings from the graph (destructive)
Find paths between two nodes in the graph
Set the camera focus to a specific node or subgraph
Get a single edge by ID with all its properties
Get a single finding by ID with full details including body and evidence
Output schemas not documented. Tool descriptions state what is returned (e.g., 'Get a single node by ID with all its properties') but do not specify the response structure (fields, types, nested objects). LLMs cannot plan downstream tool calls without knowing what fields to extract.
Tool annotations missing. Risk stratification is clear in metadata (READ_ONLY, WRITE, DESTRUCTIVE) but not exposed via MCP tool annotations (readOnlyHint, destructiveHint, idempotentHint). Agents cannot distinguish safe reads from destructive writes without parsing descriptions.
Error handling lacks recovery guidance. ToolError is raised but descriptions do not explain what to do next (e.g., 'Node not found. Try list_nodes() to discover available IDs.'). Agents receive errors with no actionable next step.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | 2025-06-18+ | v2 |
Get a high-level summary of the graph including node/edge counts and top hubs
Get neighboring nodes within a specified depth from a source node
Get a single node by ID with all its properties
Get nodes that match the current filter expression
Bulk import nodes and edges from a JSON file
List edges in the graph with optional filtering and pagination
List findings (AI-generated insights) with pagination and truncation at 50KB
List nodes in the graph with optional filtering and pagination
Load a previously saved graph snapshot
Create a new edge between two nodes in the graph
Create a new finding (AI-generated insight) with title, body, confidence, and evidence
Create a new node in the graph
Save the current graph state as a snapshot
Update an existing finding with new title, body, confidence, or other metadata
Update properties of an existing node
Descriptions lack WHEN-to-use guidance. Descriptions state WHAT each tool does but not WHEN to call it vs. similar tools. E.g., get_neighbors vs. find_paths both explore graph structure but descriptions do not clarify the distinction or use case.
Parameter constraints not validated in descriptions. Numeric limits (e.g., 'max 1000' for limit, 'max 3' for depth) are stated but no validation guidance is provided. Descriptions should explain what happens if the limit is exceeded or if invalid values are passed.