mapnotes
Summary: The MapNotes MCP server lets an AI agent read, search, and edit a MapNotes graph file (YAML/JSON) on disk, with every change saved immediately.
Load a graph file —
load_graphopens a YAML/JSON file by path and makes it the current file (missing file → empty graph).Save the graph —
save_graphwrites to the current file or saves a copy to a new path (.json→ JSON, otherwise YAML).Read the whole graph —
get_graphreturns properties, styles, nodes and edges as YAML or JSON.Inspect one node —
get_nodereturns a node with its properties and all connected edges.Search/list nodes —
find_nodesfilters by text query, style, property key/value, with paging (limit up to 200, cursor).Manage nodes —
add_node,edit_node(relabel, rename id, move, set/remove/replace properties, change style),remove_node(also drops its edges).Manage edges —
add_edge,edit_edge(endpoints, label, style, id, properties),remove_edge.Edit graph-level properties —
edit_graph_propertiessets/removes/replaces key/value pairs such astitleandsubtitle.Manage reusable styles —
set_stylecreates/replaces node or edge styles (color, shape, size, border, arrow, line style, curve, icon, icon size/color) andremove_styledeletes them.Stay in sync with the web app — when a file is open, changes are written immediately and the file is re-read before each operation, so browser or text-editor edits aren't overwritten.
Serves at runtime the icon assets referenced by node styles (Lucide line icons and full-color brand logos), so styled graphs render their icons without the project shipping or storing any icon files.
Node styles created with the set_style tool can embed Lucide line icons via the "lucide:" icon field (e.g. lucide:folder, lucide:bug), with configurable icon color and icon size. The icons are drawn inside the node's shape on the canvas.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mapnotesadd a node for the login service and connect it to the user database"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 |
|
Connect nodes |
|
Inspect / edit | Click a node or edge; edit label, id, style, properties on the right |
Select several |
|
Delete |
|
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 |
Hide / show |
|
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. |
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 |
|
Undo / redo |
|
Open / save |
|
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
typeproperty, or its style if it has none (PR styles are grouped aspr).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-static1.x): ~1,850 general-purpose line icons, writtenlucide:<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_lightis the dark logo for light fills,github_darkis 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-mcpFor 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 pathTool | Purpose |
| Open a YAML/JSON file; it becomes the current file |
| Save to the current file, or "save as" to a new path ( |
| Read the graph, or one node with its edges |
| Search nodes by id, label, property or style; paged id/label summaries for large graphs |
| Node CRUD (rename via |
| Edge CRUD (label, endpoints, style, properties) |
| Set/remove/replace graph-level key/value properties |
| Create/replace/remove reusable node and edge styles (including |
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 graphsContributing
See CONTRIBUTING.md. Commits in pull requests must be signed off (git commit -s) under the Developer Certificate of Origin.
License
Available Tools
14 toolsadd_edgeAdd edgeB
Connect two existing nodes. The id is generated if omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| label | No | ||
| style | No | Id of an edge style from the graph styles | |
| source | Yes | Source node id | |
| target | Yes | Target node id | |
| properties | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| edge | Yes | |
| file | Yes | Current graph file; null when the graph is in memory only |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| label | No | ||
| style | No | Id of a node style from the graph styles | |
| position | No | Usually omit: the web app places new nodes next to their neighbours, and lays out graphs that have no positions at all | |
| properties | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| file | Yes | Current graph file; null when the graph is in memory only |
| node | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| label | No | ||
| newId | No | ||
| style | No | ||
| source | No | ||
| target | No | ||
| properties | No | ||
| setProperties | No | ||
| removeProperties | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| edge | Yes | |
| file | Yes | Current graph file; null when the graph is in memory only |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| set | No | ||
| remove | No | ||
| properties | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| file | Yes | Current graph file; null when the graph is in memory only |
| properties | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| label | No | ||
| newId | No | ||
| style | No | ||
| position | No | ||
| properties | No | ||
| setProperties | No | ||
| removeProperties | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| file | Yes | Current graph file; null when the graph is in memory only |
| node | Yes |
TDQS
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.
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.
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.
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.
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.
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 nodesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size, default 50, max 200 | |
| query | No | Case-insensitive text matched against id, label, property keys and values | |
| style | No | Only nodes with this style id; "" for nodes without a style | |
| cursor | No | nextCursor from the previous page | |
| propertyKey | No | Only nodes with this property key (case-insensitive, exact) | |
| propertyValue | No | Only nodes with a property value containing this text (of propertyKey, if given) |
Output Schema
| Name | Required | Description |
|---|---|---|
| nodes | Yes | |
| total | Yes | |
| nextCursor | No |
TDQS
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.
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.
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.
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.
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.
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 graphARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Output format, default yaml |
Output Schema
| Name | Required | Description |
|---|---|---|
| file | Yes | Current graph file; null when the graph is in memory only |
| graph | Yes | |
| issues | Yes | Invalid file entries that were skipped when reading it |
TDQS
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.
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.
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.
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.
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.
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 nodeBRead-only
Return one node with its properties and all edges connected to it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| node | Yes | |
| edges | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the graph file |
Output Schema
| Name | Required | Description |
|---|---|---|
| file | Yes | |
| counts | Yes | |
| issues | Yes | Invalid file entries that were skipped when reading it |
TDQS
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.
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.
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.
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.
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.
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 edgeCDestructive
Remove an edge by id.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| file | Yes | Current graph file; null when the graph is in memory only |
| removedEdge | Yes |
TDQS
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.
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.
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.
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.
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.
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 nodeBDestructive
Remove a node and every edge connected to it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| file | Yes | Current graph file; null when the graph is in memory only |
| removedNode | Yes | |
| removedEdges | Yes |
TDQS
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.
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.
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.
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.
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.
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 styleADestructive
Remove a style; nodes/edges using it fall back to the default look.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| file | Yes | Current graph file; null when the graph is in memory only |
| removedStyle | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Destination file; defaults to the current file |
Output Schema
| Name | Required | Description |
|---|---|---|
| file | Yes | |
| counts | Yes | |
| format | Yes | |
| dropped | Yes | Invalid file entries that were skipped when reading it |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| icon | No | Nodes 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" | |
| name | No | ||
| size | No | Nodes only, in px, 8-300 (default 36) | |
| arrow | No | Edges only, target arrow shape | |
| color | No | Node fill / edge line color | |
| curve | No | Edges only | |
| shape | No | Nodes only | |
| width | No | Edges only, line width in px, 1-20 | |
| target | Yes | ||
| iconSize | No | Nodes only, icon size as a percentage of the node, 10-100 (default 70) | |
| iconColor | No | Nodes only, color of Lucide icons (default: black or white to suit the fill) | |
| lineStyle | No | Edges only | |
| textColor | No | ||
| borderColor | No | Nodes only | |
| borderWidth | No | Nodes only, outline width in px, 0-20 (default 2) |
Output Schema
| Name | Required | Description |
|---|---|---|
| file | Yes | Current graph file; null when the graph is in memory only |
| style | Yes |
TDQS
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.
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.
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.
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.
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.
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.
14 tool updates
v0.1.0- First observed
add_edge - First observed
add_node - First observed
edit_edge - First observed
edit_graph_properties - First observed
edit_node - First observed
find_nodes - First observed
get_graph - First observed
get_node - First observed
load_graph - First observed
remove_edge - First observed
remove_node - First observed
remove_style - First observed
save_graph - First observed
set_style
TDQS
Scored across 14 tools
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.
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.
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.
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
Related MCP Connectors
Create, validate, edit, export (markdown/svg/png/mermaid), and search JSON Canvas files.
Create, read and live-edit visual boards, Kanban plans, Gantt timelines and diagrams with AI agents.
- GoMindOAuthcom.gominddb
Persistent knowledge graph for AI agents. Remember, recall, and forget facts.
Read, create and edit noddle diagram boards, browse versions and comment as an AI collaborator.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables 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 npm9MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with Neo4j graph databases through natural language, supporting Cypher queries, schema management, data manipulation, and graph algorithms.MIT
- AlicenseNot gradedqualityCmaintenanceEnables 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.2Apache 2.0
- AlicenseAqualityFmaintenanceEnables AI assistants to interact with LightRAG knowledge graphs, supporting smart upsert for Obsidian vaults, semantic queries, and document/graph management.188Apache 2.0