Skip to main content
Glama

MapNotes

A render engine for your own graphs. Model anything as nodes and edges (pull requests → issues → projects, services → dependencies, notes → topics…), attach key/value properties, style them, and save everything as a readable YAML file.

  • Web app: interactive canvas (drag, click to inspect, hover to preview), editing of nodes, edges, graph properties and styles (including full-color brand icons), automatic layouts, search, undo/redo, dark theme by default with a light theme toggle.

  • MCP server: lets an AI assistant (Claude Code, Claude Desktop, …) load, query and edit a graph file. Open the same file in the web app (Chrome/Edge) to see its edits live.

Quick start

npm install
npm run dev                          # dev server with hot reload at http://localhost:5173
npm run build                        # static site in dist/
npm test                             # regression tests (vitest)

The web app is a static site with no backend. How it saves depends on the browser:

  • Chrome, Edge and other Chromium browsers can edit files on disk directly (File System Access API). Open a YAML/JSON file, or Save to create one, and every change is written back to that file. The file is also checked every second, so edits made by the MCP server or a text editor show up live. After a page reload the browser remembers the file but asks for permission again: click Reconnect in the status pill. Close file in the ▾ menu unlinks it; New also unlinks it so they never overwrite your file.

  • Firefox and Safari don't support that API, so work is kept in the browser (localStorage). Open loads a file's contents, and Download saves a copy.

In every browser the current graph is also kept in localStorage, and the ▾ menu can download YAML/JSON or export a PNG.

Live site

Every push to master is built and published to GitHub Pages by .github/workflows/deploy.yml: https://joecabezas.github.io/mapnotes/

Using the app

Action

How

Add node

N, + Node, or double-click empty canvas

Connect nodes

E / Connect, click source, then target

Inspect / edit

Click a node or edge; edit label, id, style, properties on the right

Select several

Shift/Ctrl + click, or Shift + drag a box on empty canvas; Ctrl+A selects all. Drag any selected node, or press the arrow keys, to move them together (arrows step along a 10px grid); the inspector can restyle or delete them at once

Delete

Del / Backspace, or the button in the inspector

Clusters

Select a node and click Convert to cluster in the inspector: it is drawn as a zone around every node connected to it (in either direction), and its own edges are hidden. The zone bends around nodes that aren't in it, so it never covers them. Click the zone to select it, drag it to move its members, and Convert to node to bring the node and its edges back as they were. The node only gets cluster: true in the file; nothing else changes

Hide / show

H hides the selected nodes and their edges; Shift+H shows them all again (the status bar counts hidden nodes). Hiding only affects the view and isn't saved, but it can be undone

Arrange

Drag nodes, or click Layout and pick one (it applies immediately; ↻ runs it again). Smart (layered) puts parents above their children and minimises edge crossings; Force-directed spreads nodes out like springs. The Repel button next to it is a switch: while it is on, the selected nodes (or all of them, if fewer than two are selected) float apart until there is room between them, held together by their edges like the atoms of a molecule: dragging one pushes the others out of its way and pulls along the ones it is connected to. The rest of the graph fades meanwhile. F fits the selection in view, or the whole graph if nothing is selected

Styles

🎨 Styles: node color/border/shape/size/icon, edge color/width/line/arrow/curve

Views

Views opens a panel to switch between saved views, create one (+) or edit the current one (✎). While a view is active, × next to Views returns to the full graph. See "Filters and saved views" below

Search

/ — matches labels, ids and property values; Enter jumps to the first hit

Undo / redo

Ctrl+Z / Ctrl+Shift+Z

Open / save

Ctrl+O / Ctrl+S (saves to the open file; Download in Firefox/Safari); Save as, JSON and PNG in the ▾ menu

Help

?

Filters and saved views

A saved view shows part of the graph: the nodes that match its filter. Nodes, edges and properties stay shared, so an edit made in a view changes the same graph you see everywhere else.

  • Create: click Views, then +. Give the view a name and choose what it shows: entity types, node styles, text, exact property values, nodes within 1–3 connections of a node, and edge labels. Values within one list are alternatives; different filters must all match. None matches nothing, and All removes that restriction. A node's entity type is its type property, or its style if it has none (PR styles are grouped as pr).

  • Switch: pick a view from the dropdown in the Views panel. The Views button is highlighted while a view is active, and the panel shows how many nodes are visible (e.g. 12/40 nodes).

  • Back to the full graph: click × next to Views.

  • Edit: ✎ in the panel lets you rename the view, change its filter, reset the filter or delete the view.

Each view keeps its own layout: dragging nodes or running a layout in a view doesn't move them anywhere else. A view only stores positions for the nodes it shows, so a node that stops matching the filter, or is removed, loses its position in that view. Selection, search and layout act on the visible nodes. Saving or downloading YAML/JSON always keeps the full graph, while PNG exports what is on the canvas.

Views are stored under the optional top-level views field of the graph file and in the browser copy. They store the filter, not a list of nodes, so new nodes that match appear in the view automatically. Files without views still work. MCP server versions from before views were added drop this field when they save; restart your MCP client to update it.

views:
  - id: people-prs
    name: People & PRs
    filters:
      types: [person, pr]
      edgeLabels: [authors]
    positions:
      alice: { x: 0, y: 0 }

Icons

Node styles can show an icon inside the node, from two open icon sets. Both are fetched at runtime from jsDelivr, so nothing is stored in this repo. The canvas needs network access to show them; if an icon can't be loaded, the node is simply drawn without it.

  • Lucide (pinned to lucide-static 1.x): ~1,850 general-purpose line icons, written lucide:<name>, e.g. lucide:folder, lucide:bug. They're drawn in one color: black or white to suit the node's fill, or Icon color to choose.

  • svgl (pinned to svgl 5.0.0): full-color brand logos, written as the svgl file name, e.g. slack, linear, obsidian. Logos with light and dark variants have a suffix: github_light is the dark logo for light fills, github_dark is the white logo for dark fills.

In 🎨 Styles, Browse… next to Icon opens a picker with a tab per set and a search box (Lucide matches names and tags, e.g. "money" finds lucide:banknote). You can also type a name directly. Icon size (%) sets how much of the node the icon fills (default 70).

Icons are drawn over the node's shape and fill. A circle (ellipse) works best; pointed shapes such as diamond or star clip the icon. For brand logos, a white fill with the brand color as the border works for most.

The MCP set_style tool accepts the same icon, iconColor and iconSize fields.

Related MCP server: Neo4j MCP Server

MCP server

The MCP server lets an AI agent read and edit a graph file. The GitHub Pages site is static, so the server runs locally on your computer over stdio. There is no connection between the website and the MCP server: Chrome or Edge reads and writes a file you choose with its file picker, while the MCP server reads and writes a file by its path. If both use the same file, the browser notices changes made by the agent when it checks the file.

Install without cloning

Install Node.js 20.6 or newer and Git, then register the server in your MCP client. You do not need a graph file yet. npm downloads the repository and dependencies into its cache on first use; you do not need a local clone or an npm account.

For Claude Code:

claude mcp add --scope user mapnotes -- npm exec --yes --package=github:joecabezas/mapnotes -- mapnotes-mcp

For another stdio MCP client, use this configuration (adjust it to your client's configuration format):

{
  "mcpServers": {
    "mapnotes": {
      "command": "npm",
      "args": ["exec", "--yes", "--package=github:joecabezas/mapnotes", "--", "mapnotes-mcp"]
    }
  }
}

Restart or reload your MCP client and call get_graph to check the connection. Without a file, the server starts with an empty graph in memory. To see edits on the web app, ask the agent to call save_graph with an absolute .yaml or .json path, then use Open in Chrome or Edge to choose that file. Or save a graph in the web app first and ask the agent to call load_graph with its path. The website's file picker does not pass the file path to the MCP server; you must give the agent that path separately. Once both use the same file, the browser checks it for changes and the MCP server re-reads it before operations. Save before restarting the MCP client: unsaved in-memory changes are lost when it stops. You can also pass the file path after mapnotes-mcp in the command above to open it at startup.

Each time the client starts the server, npm checks the latest commit on the repository's default branch and downloads it if it changed, so new tools and fixes arrive after you restart or reload the MCP client. A running server keeps its current version until then. Starting the server needs access to GitHub.

Ask your agent to install it

Paste this into Claude Code, Codex, Cursor or any agent that can run commands:

Install the MapNotes MCP server for me:
1. Register a stdio MCP server named "mapnotes" with command "npm" and arguments:
   exec --yes --package=github:joecabezas/mapnotes -- mapnotes-mcp
   In Claude Code: claude mcp add --scope user mapnotes -- npm exec --yes --package=github:joecabezas/mapnotes -- mapnotes-mcp
2. Tell me how to reload MCP servers in this client, then call mapnotes get_graph to check it works.
3. When I want to see edits in https://joecabezas.github.io/mapnotes/, ask me where to save the graph, call save_graph with that absolute path, and tell me to open the same file in Chrome or Edge. If I already have a graph file, call load_graph with its path instead.

Run from a local clone

If you are developing MapNotes, you can also run the server from this repository:

git clone https://github.com/joecabezas/mapnotes && cd mapnotes && npm install
npx tsx mcp/server.ts                  # optionally add an absolute graph file path

Tool

Purpose

load_graph

Open a YAML/JSON file; it becomes the current file

save_graph

Save to the current file, or "save as" to a new path (.json → JSON)

get_graph, get_node

Read the graph, or one node with its edges

find_nodes

Search nodes by id, label, property or style; paged id/label summaries for large graphs

add_node, edit_node, remove_node

Node CRUD (rename via newId updates edges; removing a node removes its edges)

add_edge, edit_edge, remove_edge

Edge CRUD (label, endpoints, style, properties)

edit_graph_properties

Set/remove/replace graph-level key/value properties

set_style, remove_style

Create/replace/remove reusable node and edge styles (including icon / iconSize)

When a file is open, every change is written to it immediately, and the file is re-read before each operation, so edits made to the file by other tools are not overwritten.

File format

properties:            # GraphProperty[]
  - key: title         # shown as the graph's name
    value: My graph
  - key: subtitle      # optional line shown under the title
    value: What this graph is about
styles:                # reusable looks, referenced by id
  - id: pr
    target: node       # node | edge
    color: "#7aa2f7"
    borderColor: "#c9d8ff"
    borderWidth: 2     # optional, outline width in px, 0-20 (default 2)
    textColor: "#ffffff"
    shape: ellipse     # ellipse, rectangle, round-rectangle, triangle, diamond, pentagon, hexagon, octagon, star, tag, barrel
    size: 34
    icon: github_dark  # optional, svgl logo name or lucide:<name> (see "Icons" above)
    iconColor: "#ffffff"  # optional, color of Lucide icons
    iconSize: 70       # optional, icon size as % of the node (default 70)
  - id: fixes
    target: edge
    color: "#7dcfff"
    width: 2
    lineStyle: dashed  # solid | dashed | dotted
    arrow: triangle    # triangle, vee, circle, square, diamond, tee, none
    curve: bezier      # bezier | straight | taxi
nodes:
  - id: pr-101
    label: PR 101
    style: pr                    # optional
    position: { x: 0, y: 120 }   # optional; saved when you drag
    cluster: true                # optional; draw it as a zone around the nodes connected to it
    properties:
      - key: author
        value: sam
edges:
  - id: e1
    source: pr-101
    target: issue-12
    label: fixes                 # optional
    style: fixes                 # optional
    properties: []
views:                           # optional saved views (see "Filters and saved views")
  - id: open-prs
    name: Open PRs
    filters:                     # every filter is optional
      types: [pr]                # `type` property, or style when there is none
      styles: [pr]
      query: login               # text in ids, labels and properties
      properties:                # exact key/value matches, all required
        - key: author
          value: sam
      relatedTo: [issue-12]      # only nodes within `depth` connections of these
      depth: 2                   # 1-3, default 2
      edgeLabels: [fixes]        # only edges with these labels
    positions:                   # this view's layout, only for the nodes it shows
      pr-101: { x: 0, y: 0 }

For hand-written files, properties may also be a plain mapping (properties: { author: sam }), and edge ids may be left out (they're generated). JSON with the same structure is accepted too. See examples/layering-100.yaml.

Project layout

shared/   data model, graph operations, YAML/JSON (used by everything)
mcp/      MCP server (stdio)
web/      React + Cytoscape.js frontend
examples/ sample graphs

Contributing

See CONTRIBUTING.md. Commits in pull requests must be signed off (git commit -s) under the Developer Certificate of Origin.

License

MIT

Available Tools

14 tools
add_edgeAdd edgeB

Connect two existing nodes. The id is generated if omitted.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
labelNo
styleNoId of an edge style from the graph styles
sourceYesSource node id
targetYesTarget node id
propertiesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
edgeYes
fileYesCurrent graph file; null when the graph is in memory only

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does disclose two real behavioral traits: the source/target nodes must already exist, and the id is auto-generated when omitted. It still omits permissions, failure modes (e.g. duplicate edges), and what mutation actually occurs, so it is only partially transparent for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, waste-free sentences with the primary purpose front-loaded and the id-generation caveat following. It is appropriately sized, though slightly terse given the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, but for a 6-parameter mutation tool with no annotations the description is thin – missing permission requirements, edge-duplication behavior, and semantics for label/style/properties. It is the minimum viable level rather than complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%. The description adds meaning for 'id' (auto-generated when omitted) beyond the bare schema, but says nothing about 'label', 'style', 'properties', or the source/target semantics, leaving half the parameters undocumented in prose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Connect two existing nodes'), which is clearer than a bare restatement of the name. However, it does not distinguish itself from the sibling 'edit_edge' or clarify the edge-vs-node relationship relative to 'add_node'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance, no mention of alternatives like edit_edge or remove_edge, and no exclusions. The phrase 'two existing nodes' weakly implies the precondition that the nodes must already exist, but nothing routes the agent between this and its siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_nodeAdd nodeB

Add a node. The id is generated if omitted; the label defaults to the id.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
labelNo
styleNoId of a node style from the graph styles
positionNoUsually omit: the web app places new nodes next to their neighbours, and lays out graphs that have no positions at all
propertiesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
fileYesCurrent graph file; null when the graph is in memory only
nodeYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden, and it does disclose two useful behaviors: id auto-generated when omitted and label defaulting to id. However, it says nothing about duplicate-id handling, whether a graph must be loaded first, or permission/error behavior for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with no filler, and the most important default behavior is front-loaded. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. For a mutation tool with no annotations and 40% schema coverage, the description covers defaults but omits duplicate handling, prerequisites, and the meaning of the unrendered 'properties' parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 40% (style and position are described in-schema; id, label, and properties are not). The description usefully compensates for the undocumented id and label by explaining auto-generation and defaulting, but leaves 'properties' entirely unexplained in both places.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Add a node') that clearly maps to a graph mutation. It does not name or contrast with siblings like add_edge or edit_node, but the action is unambiguous on its own.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no when-to-use or when-not-to-use guidance, and does not mention alternatives such as edit_node for modifying an existing node. Usage must be inferred from the tool name and sibling list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_edgeEdit edgeB

Edit an edge: endpoints, label, style, id or properties. Only the given fields change; "" clears label/style.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
labelNo
newIdNo
styleNo
sourceNo
targetNo
propertiesNo
setPropertiesNo
removePropertiesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
edgeYes
fileYesCurrent graph file; null when the graph is in memory only

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry behavioral weight; it does disclose two useful traits: patch semantics ("Only the given fields change") and a clearing convention ("" clears label/style). It omits permissions, error behavior, and how the properties arrays merge/remove relative to each other.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with purpose and followed by the two most consequential behavioral rules. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the patch/clearing semantics are covered. However, for a 9-parameter mutation tool with zero schema descriptions and no annotations, the property-array semantics and required-id behavior are missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description is the only source of parameter meaning, and it leaves major ambiguity: it lumps properties/setProperties/removeProperties under "properties" without explaining the merge vs. remove distinction, and never mentions that id is required or that newId renames the edge.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Edit an edge") and enumerates the editable facets (endpoints, label, style, id, properties). It is clearly distinct from edit_node/add_edge by resource name, though it never explicitly contrasts with siblings like set_style or remove_edge.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. Given siblings like set_style, remove_style, remove_edge, and add_edge, an agent gets no signal about whether editing one facet should go through those tools instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_graph_propertiesEdit graph propertiesA

Edit the key/value properties of the graph itself. set adds/overwrites keys, remove deletes keys, properties replaces the whole list. "title" names the graph (keep it short) and "subtitle" is shown under it.

ParametersJSON Schema
NameRequiredDescriptionDefault
setNo
removeNo
propertiesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
fileYesCurrent graph file; null when the graph is in memory only
propertiesYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It does disclose genuinely useful semantics — set overwrites per key, remove deletes keys, properties replaces the entire list — but says nothing about permissions, reversibility, or whether edits are immediate versus requiring a save_graph call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the tool's purpose, then parameter meaning, then special-key detail. No filler and nothing repeated from the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the parameter semantics are well covered. The remaining gap is operational: a mutation tool with no annotations should say whether edits persist immediately or depend on the sibling save_graph tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: each of the three parameters is given distinct semantics (add/overwrite vs delete vs full replacement) and it explains the otherwise undocumented 'title'/'subtitle' keys plus a formatting constraint ('keep it short').

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'Edit the key/value properties of the graph itself' — and the phrase 'of the graph itself' distinguishes it from the adjacent edit_node/edit_edge tools. It stops short of naming those siblings explicitly, so the differentiation is implicit rather than declared.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: an agent can infer this is the tool for graph-level (not node- or edge-level) properties. There is no explicit guidance on when to prefer it, and no warning about how set and properties interact when both are supplied in one call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_nodeEdit nodeA

Edit a node. Only the given fields change. setProperties adds/overwrites keys, removeProperties deletes keys, properties replaces the whole list. Renaming (newId) updates connected edges. style "" clears the style.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
labelNo
newIdNo
styleNo
positionNo
propertiesNo
setPropertiesNo
removePropertiesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
fileYesCurrent graph file; null when the graph is in memory only
nodeYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and does well on the important cases: partial-update semantics, key add/overwrite vs delete vs full-replace, rename cascading to connected edges, and that an empty style string clears the style. It omits error behavior for a nonexistent id and any permission/return context, but the operationally significant traits are disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five short clauses, each delivering a distinct operational fact with zero filler. The partial-update constraint is front-loaded immediately after the purpose, so the most important behavior is read first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and nested property object shapes are already in the schema. For an eight-parameter mutation tool with no annotations, the description covers the high-risk semantics well; the missing piece is failure behavior when id does not resolve.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it covers the four subtle parameters (properties, setProperties, removeProperties, newId) with genuinely useful semantics about mutation mode. It says nothing about id, label, or position, leaving three of eight parameters undocumented anywhere.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Edit a node") and immediately narrows scope with "Only the given fields change," which pins down patch semantics. It does not name or distinguish itself from siblings like add_node, remove_node, or edit_edge, so an agent must infer the boundary from the name alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use or when-not-to-use guidance relative to siblings, and no prerequisites stated. What it does provide is disambiguation between the three property parameters (setProperties vs removeProperties vs properties), which is useful selection guidance at the parameter level but not at the tool level.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_nodesFind nodesA
Read-only

Search or list nodes without fetching the whole graph. Returns ids with brief summaries (label, style, property and edge counts, matched fields), sorted by id; call get_node for details. All filters are optional and combine with AND; with none, lists every node. If nextCursor is returned, pass it as cursor to get the next page.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size, default 50, max 200
queryNoCase-insensitive text matched against id, label, property keys and values
styleNoOnly nodes with this style id; "" for nodes without a style
cursorNonextCursor from the previous page
propertyKeyNoOnly nodes with this property key (case-insensitive, exact)
propertyValueNoOnly nodes with a property value containing this text (of propertyKey, if given)

Output Schema

ParametersJSON Schema
NameRequiredDescription
nodesYes
totalYes
nextCursorNo

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint=true already declaring the safety profile, the description adds real value: the return shape (ids, brief summaries, matched fields, sorted by id) and the pagination contract. It discloses filter-AND semantics, which is behavior beyond the annotations and schema. An output schema exists, so the return-shape detail is partially redundant, keeping it below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with purpose and scope, then return shape, then filter/pagination rules. No filler; every sentence carries a distinct fact (scope, output, pagination).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a filtered-list read tool with annotations covering safety and an output schema covering return values, the description supplies the remaining essentials: filter combination rule, unfiltered behavior, and pagination chaining. Nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3, but the description adds inter-parameter semantics the per-field docs don't: filters combine with AND, all are optional, and cursor must be the prior call's nextCursor. That is genuine meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (search or list) and resource (nodes) plus the scope boundary: without fetching the whole graph. Explicitly differentiates from sibling get_node (for details) and implicitly from load_graph/get_graph, so an agent can pick it apart from alternatives without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives when-to-use context: all filters optional and AND-combined, no filters lists every node, and names the alternative get_node when details are needed. Pagination behavior (pass nextCursor as cursor) is spelled out, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_graphGet graphA
Read-only

Return the whole current graph (properties, styles, nodes, edges). YAML output starts with a comment naming the current file; JSON output is plain JSON.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNoOutput format, default yaml

Output Schema

ParametersJSON Schema
NameRequiredDescription
fileYesCurrent graph file; null when the graph is in memory only
graphYes
issuesYesInvalid file entries that were skipped when reading it

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already establishes a safe read, and the description adds genuinely new behavioral detail: YAML output leads with a comment naming the current file while JSON is plain. That format-dependent output trait is not derivable from the annotations. It stops short of covering size or pagination behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the scope statement front-loaded and the format nuance second. No filler and nothing redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read tool with an output schema, the description covers scope and the one behaviorally interesting aspect of output format. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single enum parameter is documented, so baseline is 3. The description goes further by explaining what the format choice actually changes in the output (filename comment present in YAML, absent in JSON), which adds meaning beyond the enum values themselves.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Return) and resource (the whole current graph) and enumerates the payload contents (properties, styles, nodes, edges). The word 'whole' plus the enumeration cleanly separates it from siblings like get_node and find_nodes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: an agent can infer this is for retrieving the entire graph rather than a single node. However, it never states when to prefer it over get_node/find_nodes or how it relates to load_graph, so routing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_nodeGet nodeB
Read-only

Return one node with its properties and all edges connected to it.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
nodeYes
edgesYes

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already tells the agent this is a safe read, so the description's main added value is the retrieval scope (properties plus connected edges). It does not disclose behavior for a missing or invalid id (error vs empty result), which matters for a lookup tool, so it only clears the annotated bar partially.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the action and resource, with zero filler. Every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return shape need not be restated. However, the zero-coverage id parameter and the undisclosed not-found behavior leave gaps that matter given the many sibling node tools an agent must choose between.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% — the single 'id' parameter is documented nowhere, and the description never explains what identifier is expected (node key, name, UUID) or its format. With one required parameter and no compensating text, the description leaves the caller guessing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Return') and resource ('node') and adds scope detail — properties plus all connected edges — which differentiates it from the plural search-style sibling find_nodes. It does not explicitly name any sibling to route against, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no exclusions, and no mention of alternatives such as find_nodes for lookup or get_graph for whole-graph retrieval. The agent must infer from the name alone whether this is the right call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

load_graphLoad graphA

Open a graph file (YAML, or JSON if it ends in .json). It becomes the current file: all later changes are saved to it automatically. A missing file starts an empty graph.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesPath to the graph file

Output Schema

ParametersJSON Schema
NameRequiredDescription
fileYes
countsYes
issuesYesInvalid file entries that were skipped when reading it

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses the persistent side effect that later changes are auto-saved to this file, and that a missing path silently starts an empty graph rather than erroring. It omits error/permission behavior and whether the previous current file is discarded.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the load action, then side effect, then edge case. Every sentence earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A mutation-style, state-changing tool; the description covers format inference, persistence behavior, and the missing-file case, and an output schema exists so return values need no explaining. Only failure/permission semantics are unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the single path parameter is documented, and the description adds real meaning by explaining that the extension selects the parser (.json vs YAML). That is genuine added value beyond the schema's generic 'Path to the graph file'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (open/load) and resource (graph file) plus format handling and the stateful consequence of loading. It implicitly contrasts with siblings like get_graph (read-only) and save_graph, though it never names an alternative explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied: call this to open a file and make it the working graph, and a missing file yields an empty graph. There is no explicit when-not or comparison to get_graph, so an agent must infer that get_graph reads the current graph rather than loading one.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_edgeRemove edgeC
Destructive

Remove an edge by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
fileYesCurrent graph file; null when the graph is in memory only
removedEdgeYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

destructiveHint=true already declares this is an irreversible mutation, so the safety profile is covered by annotations. The description adds nothing beyond that—no note about whether the edge id must exist, whether removal cascades, or what happens on failure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single terse sentence with the action front-loaded and no wasted words. It is efficient, though the extreme brevity leaves little content to structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described. Still, for a destructive mutation tool the description is thin: it omits any note on id obligations, failure behavior, or relationship to add_edge/edit_edge, leaving real gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry parameter meaning; 'by id' only weakly indicates the single argument identifies the edge. No format, source, or lookup guidance is provided for the id.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a clear verb+resource: removing an edge, identified by id. However, it does nothing to distinguish itself from siblings like remove_node, edit_edge, or remove_style, which an agent must infer.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this versus edit_edge (for modifying) or remove_node (for nodes). The agent gets no conditions, prerequisites, or exclusions to route between the removal tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_nodeRemove nodeB
Destructive

Remove a node and every edge connected to it.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
fileYesCurrent graph file; null when the graph is in memory only
removedNodeYes
removedEdgesYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true, so the destructive nature is already known. The description usefully adds that all connected edges are also removed, which is non-obvious behavior beyond the annotation. However it doesn't disclose whether auth is required or whether removal is reversible/undoable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the verb and resource, and efficiently communicates the cascade effect. No waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be explained. But for a destructive operation with an undocumented required id parameter, the description leaves gaps about parameter meaning and any preconditions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the single parameter 'id' is undocumented in the schema. The description does not clarify what the id refers to (node id vs other identifier). Baseline 4 for 0 params doesn't apply since there is 1 param; with no schema docs the description should compensate but doesn't.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (remove) and resource (node), plus the cascade effect on connected edges. Distinguishable from remove_edge, though it doesn't explicitly name that sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this over remove_edge or before/after other operations. The cascade behavior is stated but no when-to-use or alternatives context is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_styleRemove styleA
Destructive

Remove a style; nodes/edges using it fall back to the default look.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
fileYesCurrent graph file; null when the graph is in memory only
removedStyleYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, and the description adds genuinely useful context beyond that: nodes/edges referencing the removed style fall back to the default look. This predicts the side effect on dependent entities, which the annotation alone does not convey. It stops short of covering failure modes or whether the fallback is reversible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One compact sentence with the operation front-loaded and the side effect immediately following. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. The description covers what the tool does and its main destructive consequence; the remaining gap is the undocumented id parameter, which is minor for such a small schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single required parameter (id) with 0% schema description coverage, so the description carries the full burden and does not name or explain it. 'A style' weakly implies id identifies the style to delete, but no format, source, or lookup guidance is given.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (Remove) plus resource (a style), which clearly identifies the operation and contrasts with the sibling set_style. It doesn't explicitly name the alternative, but the purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the name — 'remove a style' tells the agent this is the deletion path versus set_style for applying styles, but there is no explicit when-to-use guidance or prerequisite (e.g. whether the style must be unused or what happens if id is invalid). Adequate but with real gaps.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_graphSave graphA

Save the current graph. With a path, saves a copy there (format from the extension: .json → JSON, otherwise YAML) and makes it the current file.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoDestination file; defaults to the current file

Output Schema

ParametersJSON Schema
NameRequiredDescription
fileYes
countsYes
formatYes
droppedYesInvalid file entries that were skipped when reading it

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses a real side effect (the saved path becomes the current file) and the format-inference rule, but says nothing about overwriting existing files, permission requirements, or failure behavior for an unspecified path.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the core action, with the conditional path behavior following immediately. Every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-required-parameter tool with an output schema (so return values need no explanation), the description covers the main behavioral question. It leaves overwrite/error semantics unstated, which is a minor but real gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, and the description adds meaning the schema lacks: the format is inferred from the file extension (.json → JSON, otherwise YAML). It does not clarify directory creation or relative-path resolution.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Save the current graph') and immediately qualifies the scope of the save. It contrasts functionally with load_graph in the sibling set, though it never names an alternative explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly explains the two operating modes: with a path it saves a copy there; without one it saves the current graph. This is conditional usage guidance, but it gives no guidance on when to prefer saving a copy versus saving in place, and names no alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_styleCreate or replace styleA

Create or replace (by id) a reusable style in the graph styles. Assign it via the "style" field of nodes/edges. Colors are CSS colors, e.g. "#7aa2f7". Fields marked "Nodes only" / "Edges only" are rejected for the other target.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
iconNoNodes only, icon drawn inside the node. A full-color brand logo from svgl by its library file name without .svg (https://svgl.app), e.g. "slack", "linear", "github_dark"; or a Lucide line icon as "lucide:<name>" (https://lucide.dev/icons), e.g. "lucide:folder", "lucide:bug"
nameNo
sizeNoNodes only, in px, 8-300 (default 36)
arrowNoEdges only, target arrow shape
colorNoNode fill / edge line color
curveNoEdges only
shapeNoNodes only
widthNoEdges only, line width in px, 1-20
targetYes
iconSizeNoNodes only, icon size as a percentage of the node, 10-100 (default 70)
iconColorNoNodes only, color of Lucide icons (default: black or white to suit the fill)
lineStyleNoEdges only
textColorNo
borderColorNoNodes only
borderWidthNoNodes only, outline width in px, 0-20 (default 2)

Output Schema

ParametersJSON Schema
NameRequiredDescription
fileYesCurrent graph file; null when the graph is in memory only
styleYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It does disclose the meaningful behavior that the operation is a replace-by-id upsert and that mismatched node/edge fields are rejected, which is useful. However, it omits permissions, whether built-in styles can be overwritten, and whether persistence requires save_graph.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the create/replace behavior, followed by usage and the validation constraint. No filler, though the color-format example sits slightly apart from the main point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 16-parameter mutation tool with no annotations, the description covers the core behavior and the key validation rule, and an output schema presumably documents the return. It still leaves open operational context such as persistence requirements and permission needs, which matters for a write-style tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, so most parameters are already documented, and the description reinforces the node/edge field restriction and CSS color format rather than adding new syntax. It clarifies the 'target' semantics and id-based replacement but leaves several parameters (textColor, name) without added meaning. Baseline 3 is appropriate given the schema does most of the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('create or replace a reusable style in the graph styles') and clarifies the upsert-by-id semantics, distinguishing it clearly from the sibling remove_style. The agent immediately knows this writes a style definition rather than manipulating nodes or edges.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains how the created style is consumed ('Assign it via the "style" field of nodes/edges') and imposes a concrete applicability rule ('Fields marked "Nodes only" / "Edges only" are rejected for the other target'). It does not state prerequisites such as whether the graph must be loaded or saved, but the usage context is otherwise clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 14 tool updatesv0.1.0
    • First observedadd_edge
    • First observedadd_node
    • First observededit_edge
    • First observededit_graph_properties
    • First observededit_node
    • First observedfind_nodes
    • First observedget_graph
    • First observedget_node
    • First observedload_graph
    • First observedremove_edge
    • First observedremove_node
    • First observedremove_style
    • First observedsave_graph
    • First observedset_style

TDQS

A3.7/5.0

Scored across 14 tools

Disambiguation5/5

Each tool targets a distinct resource/action pair: graph file I/O (load/save), whole-graph retrieval, node/edge CRUD, graph property editing, and style management. get_node vs find_nodes are clearly differentiated (detail vs search), and edit_node/edit_edge/edit_graph_properties have non-overlapping targets.

Naming Consistency5/5

All tool names use a consistent snake_case verb_noun pattern (load_graph, save_graph, get_node, add_edge, edit_node, remove_style, etc.). There are no deviations into camelCase or vague single-word names.

Tool Count5/5

The 14 tools precisely cover the graph-notes domain without redundancy. Each tool earns its place by handling a specific operation on nodes, edges, graph properties, or styles.

Completeness4/5

Core lifecycle coverage is strong: nodes have add/get/list/edit/remove, edges have add/edit/remove, and graph properties/styles are editable. Minor gaps exist: no direct get_edge or list_styles/get_style, though these can be inferred from get_graph or get_node.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to interact with Gremlin-compatible graph databases through natural language, supporting schema discovery, complex graph queries, relationship analysis, and data import/export operations.
    15 npm
    9
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to interact with Neo4j graph databases through natural language, supporting Cypher queries, schema management, data manipulation, and graph algorithms.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to create, edit, and export flowcharts through a local web-based editor with visual drag-and-drop, real-time sync, and 14 MCP tools for full node/edge CRUD.
    2
    Apache 2.0
  • A
    license
    A
    quality
    F
    maintenance
    Enables AI assistants to interact with LightRAG knowledge graphs, supporting smart upsert for Obsidian vaults, semantic queries, and document/graph management.
    18
    8
    Apache 2.0