nodus (sorenwacker/nodus) is an MCP server listed on the M8ven Trust Index. It scores 74 out of 100, grade C. It declares 60 tools. No publisher has claimed this listing.
Knowledge graph on a canvas. Notes are Markdown files in Open Knowledge Format, with Typst math, PDF-to-graph import with citation verification, and storylines that read and export as documents. Local-first, no account.
Emerging. No concerning findings. Grades remain capped until the project builds reputation through adoption. Grades reflect the full trust pyramid: code, verification depth, and reputation. New projects cap at C until adoption is earned.
How we verified
Verified is a snapshot. Live keeps it current, and builds your track record.
⚡ Connect GitHub → continuous verification on every pushwhy connect →Who stands behind it
sorenwacker
Source: github_repo_search
Claim it to get a verified publisher badge, a free copy of our full audit findings, and direct contact for any high-priority issues we find. Or connect your repo for our deepest verification, Live Monitored: read-only, revoke anytime. What we access →
Install from
The grade above is for the source repository. Registries can serve a different version, so we mark the ones we were not able to read.
These names and descriptions are the publisher's own, read from the source code. We print them as written. Our assessment is the findings above, not this list.
get_graph_summaryGet a compact summary of the graph: node count, edge count, node types, and most connected nodes. Use this first to understand the graph before fetching details.
list_nodesList nodes in the current workspace. Returns compact node metadata (id, title, type). Use limit/offset for large graphs.
get_nodeGet a specific node by ID, including its full content.
get_node_neighborsGet a node and all its direct connections. Returns the node, its neighbors, and the edges between them. Best way to explore graph structure.
get_graph_structureGet a compact adjacency list showing how nodes connect. Returns {nodeId: {title, connections: [neighborTitles]}}. Best for understanding overall topology.
search_nodesSearch nodes by title or content.
get_orphan_nodesFind nodes with no connections. Useful for finding isolated content.
get_connected_componentsReport how many separate groups the graph falls into, and which nodes are in each. Call this before claiming the graph is connected.
get_leaf_nodesFind leaf nodes (nodes with no outgoing edges/children). These are endpoints in the graph.
get_root_nodesFind root nodes (nodes with no incoming edges/parents). These are starting points in the graph.
get_hub_nodesFind nodes with most connections. Useful for finding central concepts.
get_nodes_by_colorFind all nodes with a specific color.
get_edgesGet edges (connections) between nodes. Use limit/offset for large graphs, or filter by node_id.
list_workspacesList all workspaces; the current one (open in the app) is marked.
set_workspaceScope this connection to a workspace by id or name. All further reads and writes target that workspace, independent of what is open in the app - multiple connections can work different workspaces in parallel.
get_workspaceShow which workspace this connection is scoped to, if any.
create_nodeCreate a new node in the workspace.
update_nodeUpdate an existing node.
resize_nodeResize a single node.
batch_resize_nodesResize multiple nodes at once. Useful for normalizing node sizes.
batch_move_nodesMove multiple nodes at once. Positions are absolute canvas coordinates, not offsets from where a node is now.
batch_update_nodesUpdate several nodes at once: title, content or position. Each entry names the node by id and carries only the fields to change.
get_duplicate_edgesList edges that connect the same pair of nodes more than once, grouped by pair. Reports only; removes nothing.
cleanup_duplicate_edgesRemove duplicate edges, keeping one edge per connected pair. Use get_duplicate_edges first to see what would go.
set_node_colorSet the color theme of a node.
batch_set_node_colorsSet colors for multiple nodes at once.
delete_nodeDelete a node from the workspace.
create_edgeCreate an edge (connection) between two nodes.
update_edgeUpdate an existing edge.
delete_edgeDelete an edge from the workspace.
batch_create_edgesCreate multiple edges at once. Efficient for connecting many nodes.
batch_delete_edgesDelete multiple edges at once.
delete_edges_for_nodeDelete all edges connected to a node. Useful for breaking up hub nodes before reorganizing.
arrange_radialArrange nodes in a circle around a center node. Great for creating category layouts.
list_framesList all frames in the workspace. Frames are visual containers for grouping related nodes spatially on the canvas (e.g., by topic, project, or category).
get_frameGet a specific frame by ID, including its position, size, and color.
create_frameCreate a frame to visually group nodes. Frames are rectangular containers that help organize the canvas spatially. Use them to create topic areas, project sections, or category groups.
update_frameUpdate frame properties (title, position, size, or color).
delete_frameDelete a frame. Nodes inside are not deleted, they just become unframed.
get_nodes_in_frameGet all nodes assigned to a frame.
assign_node_to_frameAssign a node to a frame and move it inside the frame bounds. The node will move with the frame when dragged.
remove_node_from_frameRemove a node from its frame. The node stays in place but is no longer grouped.
batch_assign_nodes_to_frameAssign multiple nodes to a frame at once. Nodes outside the frame are moved inside and stacked vertically.
batch_move_framesMove multiple frames at once. Nodes assigned to each frame move with it.
batch_resize_framesResize multiple frames at once. Nodes are pulled inside if they would be outside.
fit_frame_to_contentsResize a frame to fit all its assigned nodes with padding. Resolves overlaps with other frames.
fit_all_framesResize all frames to fit their contents and resolve overlaps.
check_frame_overlapsCheck if any frames overlap with each other. Returns pairs of overlapping frames.
resolve_frame_overlapsAutomatically resolve frame overlaps by pushing frames apart horizontally.
list_storylinesList all storylines. Storylines are ordered sequences of nodes that form a narrative path or reading order through the graph (e.g., argument flow, timeline, chapter order).
get_storylineGet a storyline by ID, including its title, description, and color.
get_storyline_nodesGet the ordered list of nodes in a storyline.
create_storylineCreate a storyline to define an ordered path through nodes. Use storylines for reading orders, argument progressions, timelines, or any linear narrative. Nodes are connected by edges automatically.
update_storylineUpdate storyline properties (title, description, or color). Color changes apply to all edges in the storyline.
delete_storylineDelete a storyline. Nodes are not deleted, but the storyline edges are removed.
add_node_to_storylineAdd a node to a storyline. By default, adds to the end. Use position to insert at a specific index. Edges are created automatically.
remove_node_from_storylineRemove a node from a storyline. Adjacent nodes are reconnected automatically.
reorder_storyline_nodesReorder all nodes in a storyline. Provide the complete list in the desired order. Edges are recreated automatically.
get_viewportGet the current canvas viewport position and zoom level.
focus_nodeFocus the canvas on a specific node.
NODUS_MCP_PORTWebSocket port (default: 9742)Tool annotations
No tools have read-only/destructive annotations
Add readOnlyHint or destructiveHint annotations to every tool so hosts can warn users before invoking.
All four hints declared on every tool
60/60 tools missing one or more hints — get_graph_summary (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint); list_nodes (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint); get_node (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint), +57 more. OpenAI's directory rejects tools where any of the four hints are missing or non-boolean.
For every tool, set all four hints (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) to explicit true/false values that match the handler’s actual behaviour.
Tests exist
No test files found
Add tests that exercise each declared tool.
Claim the listing to review these findings one by one and send us a correction where you disagree, straight to the team. Claiming also means we tell you when the grade moves, and reach you first if we find anything urgent.
[](https://m8ven.ai/mcp/sorenwacker/nodus)?variant=verified to the badge URL.Vetting this one by hand? Tool Check is an MCP that scores other MCPs. Add it once and ask Claude, ChatGPT, or any MCP client to grade a server, surface CVEs, check the publisher, and suggest safer alternatives — before you install.
https://m8ven.ai/api/mcp/tool-check