Skip to main content
Glama
lucaszarzur

CherryTree MCP Server

by lucaszarzur

CherryTree MCP Server

MCP server that exposes reading and writing of CherryTree .ctd (XML) files as native Claude Code tools.

Supports rich text, codeboxes, tables, images, anchors, and bookmarks. All writes go through automatic byte-by-byte auditing comparing the backup with the resulting file on disk.

Available Tools

Reading

  • list_nodes — list tree nodes (with depth and breadcrumb)

  • read_node — read a node's content (text, formatting, widgets)

  • search_nodes — full-text search across all nodes

  • list_bookmarks — list nodes marked as favorites

Writing

  • create_node — create node (plain text or rich XML via content_xml)

  • create_node_with_codebox — create node with codebox (or rich XML via content_xml)

  • update_node_content — replace or append (plain text or rich XML via content_xml)

  • append_codebox_to_node — add codebox or rich XML to an existing node

  • update_node_properties — change name, tags, icon, color, readonly

  • delete_node — delete node and children

  • move_node — move node to another parent

Bookmarks

  • add_bookmark — add node to favorites

  • remove_bookmark — remove node from favorites

Related MCP server: notion-full-mcp

Rich Text (content_xml)

The writing tools accept content_xml for full CherryTree formatting:

<rich_text scale="h1" foreground="#00000000ffff" weight="heavy">Título</rich_text>
<rich_text>
Texto normal com </rich_text>
<rich_text weight="heavy">negrito</rich_text>
<rich_text> e </rich_text>
<rich_text style="italic">itálico</rich_text>
<rich_text foreground="#e66100" weight="heavy"> e laranja bold</rich_text>
<rich_text link="node 42">link interno</rich_text>

Supported attributes in <rich_text>

Attribute

Values

Example

weight

heavy

bold

foreground

#RRRRGGGGBBBB (48-bit GTK)

#00000000ffff (blue)

background

#RRRRGGGGBBBB

highlight

style

italic

italic

underline

single

underlined

strikethrough

true

strikethrough

scale

h1-h6, small, sup, sub

headings

family

monospace

monospaced

justification

left, center, right, fill

alignment

link

webs URL, node UID, file BASE64, fold BASE64

links

indent

1-3

indentation

Widgets (positioned by char_offset)

Widgets are rendered inline at the char_offset position (character count in the concatenated text of the <rich_text> elements). Each widget occupies exactly 1 character in the buffer.

<codebox char_offset="42" justification="left" frame_width="700"
         frame_height="200" width_in_pixels="1"
         syntax_highlighting="python3" highlight_brackets="1"
         show_line_numbers="0">print("hello")</codebox>

<table char_offset="100" col_min="40" col_max="400"
       col_widths="200,200" is_light="0">
  <row><cell>valor1</cell><cell>valor2</cell></row>
  <row><cell>header1</cell><cell>header2</cell></row>
</table>

<encoded_png char_offset="50" anchor="nome_ancora"/>

Architecture

  • Reads use lxml for XML parsing/queries (safe, no write-back)

  • Writes use raw string manipulation to avoid \r normalization that corrupts char_offset in unedited nodes (lxml/ET serialization bug)

  • Backup .ctd.bak created automatically before each write

  • Audit byte-by-byte after each write: reads backup and new file from disk, compares prefix/suffix, identifies changed node, counts total nodes, validates XML

Audit format

Every write operation returns a report like:

[AUDIT] readback 45,120,109 bytes: OK
  delta: +252 bytes (45,119,857 -> 45,120,109)
  change region: bak[45,119,844:45,119,844] -> disk[45,119,844:45,120,096]
  prefix (45,119,844 bytes): OK
  suffix (13 bytes): OK
  nodes: 5304 (backup) -> 5305 (disco) [+1]
  node adicionado: 6481 "Nome do Node" (alvo)
  integridade: OK
  XML parse: OK

If any byte outside the target region differs between backup and disk, the report displays CORRUPTED! and INTEGRITY FAILURE.

Installation

1. Create virtualenv and install dependencies

cd ~/cherrytree-mcp
python3 -m venv .venv
.venv/bin/pip install -e .

2. Configure MCP in Claude Code

claude mcp add cherrytree -s user \
  -e CHERRYTREE_FILE="/caminho/para/seu/arquivo.ctd" \
  -- /caminho/para/cherrytree-mcp/.venv/bin/python \
     /caminho/para/cherrytree-mcp/server.py

3. Restart Claude Code

The tools appear automatically as mcp__cherrytree__<tool_name>.

Environment variables

Variable

Description

CHERRYTREE_FILE

Absolute path to the CherryTree .ctd file

Requirements

  • Python >= 3.11

  • CherryTree v1.x (.ctd XML format, not .ctb SQLite)

  • Dependencies: mcp[cli]>=1.0.0, lxml>=5.0.0

Limitations

  • Only .ctd (XML) format. .ctb (SQLite) files are not supported.

  • CherryTree needs to be reloaded (close/open or switch nodes) after MCP edits to reflect changes in the UI.

  • Write operations with append=False in update_node_content replace the entire node content (text, codeboxes, images, tables).

Available Tools

13 tools
add_bookmarkA

Add a node to bookmarks.

Args: node_id: Node ID.

Returns: Confirmation message followed by byte-by-byte audit report. On XML parse failure, backup is restored automatically (ROLLBACK).

ParametersJSON Schema
NameRequiredDescriptionDefault
node_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/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 it adds meaningful operational detail: the return includes a confirmation message and byte-by-byte audit report, and XML parse failures trigger an automatic rollback/backup restore. This goes beyond a simple 'Add a node to bookmarks' statement.

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?

The description is short, labeled, and front-loaded with the core action. It avoids filler, though the returns/rollback details could have been compressed further without losing value.

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 single-parameter tool with an output schema, the description covers the action, parameter, return, and failure behavior. Still, gaps in usage guidance and parameter sourcing keep it from being fully complete.

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 needed to add meaning, but 'node_id: Node ID' only repeats the schema's property title. It does not explain how to obtain a node_id, what qualifies as a valid node, or what happens if the node is already bookmarked.

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 and resource: adding a node to bookmarks. The contrast with siblings like remove_bookmark and create_node makes its role unambiguous without needing to open the schema.

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 such as remove_bookmark or list_bookmarks. There are no prerequisites, exclusions, or context to help an agent decide to select this tool.

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

append_codebox_to_nodeA

Append a codebox (or raw XML content) to an existing node.

Args: node_id: Node ID. code: Code content (ignored if content_xml is set). syntax: Syntax language. text_before: Text before codebox (ignored if content_xml is set). text_after: Text after codebox (ignored if content_xml is set). content_xml: Raw CherryTree XML to append. See create_node docs for format.

Returns: Confirmation message followed by byte-by-byte audit report. On XML parse failure, backup is restored automatically (ROLLBACK).

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNo
syntaxNosh
node_idYes
text_afterNo
content_xmlNo
text_beforeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Since no annotations are provided, the description carries the full behavioral burden. It discloses parameter precedence (code/text are ignored if content_xml is set), automatic rollback on XML parse failure, and a byte-by-byte audit report in the return value. It could additionally note mutation/persistence side effects, but append semantics already imply modification.

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?

The description is compact, front-loaded with the core action, and organized into clear Args/Returns sections. Each line adds necessary information, with no filler or repetition of schema defaults.

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 tool with six parameters, raw XML input, rollback behavior, and an output schema, the description covers all necessary invocation details: parameter meanings, precedence rules, return format, and failure recovery. It is complete enough for an agent to call correctly without needing additional context.

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%, and the description fully compensates by defining every parameter: node_id, code, syntax, text_before, text_after, and content_xml. It also adds critical semantic nuance, such as which parameters are ignored when content_xml is provided.

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?

The description opens with a specific verb and resource: 'Append a codebox (or raw XML content) to an existing node.' It also explicitly scopes the target to an existing node, which distinguishes it from create_node_with_codebox without ambiguity.

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 clearly: use this when appending to an existing node. However, it does not explicitly name alternatives like create_node_with_codebox or update_node_content, nor does it state when not to use this tool in favor of those siblings.

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

create_nodeA

Create a new rich-text node.

Args: name: Node title. content: Plain text body (ignored if content_xml is set). content_xml: Raw CherryTree XML body — supports full formatting: segments with attributes (weight="heavy", foreground="#RRRRGGGGBBBB", background, style="italic", underline="single", strikethrough="true", scale="h1"|"h2"|"h3"|"h4"|"h5"|"h6"|"small"|"sup"|"sub", family="monospace", justification="left"|"center"|"right"|"fill", link="webs URL"|"node UID"|"file BASE64"|"fold BASE64", indent="1"-"3"), (char_offset, syntax_highlighting, frame_width, frame_height), (char_offset, col_widths), (char_offset, anchor for anchors, filename for embedded files). char_offset = position in concatenated plain text where widget is rendered; each widget occupies 1 char in the count. parent_id: Parent node ID (0 = top-level). tags: Space-separated tags. is_bold: Bold title. foreground: Title color hex (48-bit GTK: #RRRRGGGGBBBB). custom_icon_id: Icon ID.

Returns: Confirmation message followed by byte-by-byte audit report: [AUDIT] readback, delta, change region, prefix/suffix integrity, node count, target node identification, XML parse result. On XML parse failure, backup is restored automatically (ROLLBACK).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
tagsNo
contentNo
is_boldNo
parent_idNo
foregroundNo
content_xmlNo
custom_icon_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 behavioral disclosure burden. It discloses key behaviors: content is ignored if content_xml is set, a byte-by-byte audit report is returned, and backup restoration occurs automatically on XML parse failure. It does not discuss permissions or side effects beyond creation, but it is detailed 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?

The description is long but every section serves a purpose: an immediate one-line purpose, structured Args with meaningful detail, and a Returns section explaining audit and rollback behavior. The XML formatting detail is essential for correct invocation and is well organized.

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?

Given 8 parameters, no annotations, and 0% schema coverage, the description is unusually complete: it explains all parameters, return behavior, and failure recovery. The main completeness gap is the lack of guidance on how this tool relates to create_node_with_codebox and what happens with invalid parent or foreground values.

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 explain every parameter. It does so thoroughly, including the parent_id default, text vs XML precedence, the full rich-text XML attribute list, char_offset semantics, tag format, and 48-bit GTK color format.

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 begins with 'Create a new rich-text node,' which is a specific verb and resource. It clearly explains what the tool does, but does not explicitly distinguish itself from the sibling create_node_with_codebox, which also creates nodes with code-related content.

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 is given about when to use this tool versus alternatives such as create_node_with_codebox or update_node_content. The description implies general node creation but never states exclusions or selection criteria.

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

create_node_with_codeboxA

Create a node with an embedded codebox.

If content_xml is provided, it is used as the full body (text_before/code/text_after ignored).

Args: name: Node title. text_before: Text before the codebox. code: Code content. syntax: Language (sh, python3, sql, java, etc.). text_after: Text after the codebox. parent_id: Parent node ID (0 = top-level). tags: Tags. content_xml: Raw CherryTree XML body (overrides other content params). See create_node docs.

Returns: Confirmation message followed by byte-by-byte audit report. On XML parse failure, backup is restored automatically (ROLLBACK).

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNo
nameYes
tagsNo
syntaxNosh
parent_idNo
text_afterNo
content_xmlNo
text_beforeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations to rely on, the description discloses important behavioral traits: content_xml overrides other content parameters, returns a confirmation plus a byte-by-byte audit report, and automatically restores a backup on XML parse failure. This goes beyond the minimal mutation implication, though it does not mention permissions or side effects beyond creation.

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?

The description is well organized into a one-line purpose, a key conditional note, an Args list, and a Returns section. It is compact but contains no filler, and the most important precedence rule is front-loaded.

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 an 8-parameter tool with no annotations, the description covers all parameters, clarifies precedence, and explains return and rollback behavior, which is strong. It is not fully complete because it omits tool-selection guidance and some format details, but the essential invocation information is present.

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 carry parameter meaning, and it does. Every parameter is listed with a concise explanation, including syntax examples, parent_id default semantics, and the crucial content_xml override behavior, which adds real value beyond the raw schema.

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 opens with a specific verb and resource: 'Create a node with an embedded codebox.' This clearly distinguishes it from a generic node creation tool, though it does not explicitly contrast itself with siblings like create_node or append_codebox_to_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?

The description provides no guidance on when to use this tool versus alternatives such as create_node or append_codebox_to_node. It only gives parameter precedence rules for content_xml and references create_node docs, but does not explain tool selection criteria.

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

delete_nodeA

Delete a node and all its children.

Args: node_id: Node ID.

Returns: Confirmation message followed by byte-by-byte audit report. On XML parse failure, backup is restored automatically (ROLLBACK).

ParametersJSON Schema
NameRequiredDescriptionDefault
node_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 behavioral burden and does well: it discloses cascading deletion, the confirmation-and-audit return format, and automatic backup restoration (ROLLBACK) on XML parse failure. It could go further by stating irreversibility or permission requirements, but the disclosed traits are materially useful.

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?

The description is compact, well-structured with Args/Returns sections, and front-loads the most important semantic information. Every sentence contributes meaningful detail without redundancy.

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 one-parameter tool with an output schema, the description covers the destructive scope, the return shape, and an important failure behavior. The main completeness gap is the lack of guidance on how to obtain or validate node_id, but overall the core calling context is well covered.

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%, so the description must compensate, but 'node_id: Node ID' merely restates the schema's property title and type. It adds no guidance on where the node ID comes from, how it is represented, or any constraints 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?

The description states a specific action ('Delete'), a concrete resource ('a node'), and its full scope ('and all its children'). This clearly distinguishes it from sibling tools, especially move_node and the various create/update tools.

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?

The tool's purpose strongly implies when it should be used, but the description gives no explicit guidance about alternatives or exclusions. It does not mention, for example, that move_node should be preferred when preserving the subtree is desired, so the usage context is only implied.

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

list_bookmarksA

List all bookmarked nodes.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the behavioral burden, and 'List all bookmarked nodes' clearly signals a read-only operation with no side effects. However, it does not disclose pagination, ordering, or the exact semantic of 'all,' and it provides no context on how bookmarks are represented.

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?

The description is a single front-loaded sentence with no filler. Every word carries meaning, making it appropriately compact without becoming under-specified.

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-parameter listing tool with an output schema, the one-line description is largely sufficient: the agent knows the action and resource, and the schema covers the return shape. It is slightly incomplete in that it does not orient the agent against sibling tools or note any special bookmark behavior.

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?

The input schema has zero parameters, so there is nothing for the description to clarify and no parameter information is missing. The 0-parameter baseline applies cleanly here.

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?

The description uses a specific verb ('List') and resource ('bookmarked nodes'), making the operation unmistakable. The word 'bookmarked' differentiates it from sibling tools like list_nodes and aligns it with add_bookmark/remove_bookmark without needing to inspect schemas.

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 guidance on when to choose this tool over list_nodes or search_nodes, and no mention of prerequisites or intended scenarios. The description states only what the tool does, leaving the selection decision entirely to the agent's inference.

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

list_nodesB

List nodes in the CherryTree tree.

Args: parent_id: Parent node ID (0 = top-level). depth: Levels to descend. include_path: Include breadcrumb paths.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNo
parent_idNo
include_pathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations available, the description must carry the behavioral disclosure burden. It does convey some behavior through parameter details like depth descending levels and include_path adding breadcrumb paths, but it omits broader behavioral traits such as output order, recursion limits, or side-effect safety. 'List' implies a read-only operation, but the description never explicitly states that or covers edge cases.

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?

The description is concise: one sentence for purpose and a compact Args list. Every line adds necessary information, and there is no redundant filler. It loses a point because it omits a brief usage-context sentence that could further help an agent without bloating the text.

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?

The output schema exists, so return-value documentation is not the description's responsibility. Parameters are described adequately for a simple listing tool. However, the description lacks guidance on when to use list_nodes versus search_nodes and does not clarify traversal edge cases or relationship to the CherryTree hierarchy beyond parent_id and depth.

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?

The input schema has 0% description coverage, so the Args section is the only source of parameter meaning. It usefully explains parent_id (0 = top-level), depth (levels to descend), and include_path (breadcrumb paths). This strongly compensates for the schema gap, though the exact format of breadcrumb paths and depth semantics could be clearer.

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 the core action clearly: 'List nodes in the CherryTree tree.' It identifies both the verb and the resource, which is sufficient for basic purpose clarity. However, it does not explicitly differentiate this tool from sibling tools like search_nodes or read_node, so it falls 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?

No guidance is provided about when to use this tool instead of alternatives. The description does not mention search_nodes, read_node, or any situation where list_nodes is preferred. The usage context is only implied by the word 'List,' which is weak guidance.

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

move_nodeA

Move a node under a different parent.

Args: node_id: Node to move. new_parent_id: Destination parent (0 = top-level).

Returns: Confirmation message followed by byte-by-byte audit report. On XML parse failure, backup is restored automatically (ROLLBACK).

ParametersJSON Schema
NameRequiredDescriptionDefault
node_idYes
new_parent_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

There are no annotations, so the description carries the behavioral burden. It discloses the return format, the byte-by-byte audit report, and the automatic backup/rollback behavior on XML parse failure. It stops short of detailing validation side effects like cycle prevention, but the disclosed rollback semantics are still valuable.

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?

The description is compact, front-loaded with the purpose, and uses clear Args/Returns sections. Every sentence adds relevant information without unnecessary fluff.

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 mutating XML-backed operation with no annotations, the description covers the required inputs, return behavior, and an important failure/rollback path. It does not mention all possible constraints such as invalid parent relationships or effects on child ordering, but it is largely complete for invoking the tool correctly.

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 fully compensates by explaining both parameters. node_id is defined as the node to move, and new_parent_id is clarified as the destination parent with the special value 0 meaning top-level.

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?

The description opens with a precise operation statement, 'Move a node under a different parent,' which clearly identifies the verb, resource, and result. This distinguishes it from sibling read/create/update/delete tools.

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?

The intended use case is implied by the operation itself: an agent should call this when reparenting a node. However, there is no explicit guidance about when not to use it, and no comparison with alternatives such as update_node_properties.

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

read_nodeA

Read content of a CherryTree node.

Args: node_id: Node unique ID (preferred). node_name: Search by name (partial, case-insensitive). include_formatting: Return rich-text segment details. include_widgets: Return codebox/image/table/anchor details.

ParametersJSON Schema
NameRequiredDescriptionDefault
node_idNo
node_nameNo
include_widgetsNo
include_formattingNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

With no annotations, the description carries the burden of behavioral disclosure. 'Read' and 'Return ... details' signal a non-mutating lookup and the include_* flags describe what extra content comes back, but the description does not specify precedence when both node_id and node_name are supplied, behavior for multiple name matches, or what happens when no node is found.

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?

The description is compact and front-loaded, with a one-sentence purpose followed by a tight argument list. Every line adds information that is not otherwise present in 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?

For a read tool with four optional parameters, an output schema removes the need to describe return structure, and all arguments are semantically covered. The main gaps are minor interaction rules: what happens if both node_id and node_name are provided, and whether node_name matching returns one node or multiple.

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%, and the description compensates fully by explaining each parameter: node_id is the preferred unique ID, node_name is a partial case-insensitive search, include_formatting controls rich-text segment details, and include_widgets names the widget types included. This adds real meaning beyond the bare schema types and defaults.

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?

The description opens with a specific verb and resource: 'Read content of a CherryTree node.' That wording distinguishes read_node from sibling tools such as list_nodes and search_nodes by focusing on content retrieval rather than listing or searching.

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?

The read-only purpose is clear from the verb, so an agent can infer when to use it over mutating siblings, but the description gives no explicit when to use/when not to use guidance and does not point to list_nodes or search_nodes for locating nodes by other criteria.

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

remove_bookmarkA

Remove a node from bookmarks.

Args: node_id: Node ID.

Returns: Confirmation message followed by byte-by-byte audit report. On XML parse failure, backup is restored automatically (ROLLBACK).

ParametersJSON Schema
NameRequiredDescriptionDefault
node_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior4/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 of behavioral disclosure. It adds valuable context by describing the confirmation message, the byte-by-byte audit report, and automatic rollback on XML parse failure. It could also clarify that the node itself is not deleted, but the provided behavioral detail is strong.

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?

The description is concise and well-structured with clear Args and Returns sections. Every line adds useful information, and there is no filler or redundancy.

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 single-parameter mutation with an output schema, the description covers the core action, the return type, and an important rollback behavior. It is nearly complete, though it leaves minor ambiguities about edge cases such as removing a bookmark that does not exist.

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%, so the description must compensate for the lack of parameter documentation. However, it only restates 'node_id: Node ID', which adds no meaning beyond the schema's integer type and title. No additional detail about constraints, lookup behavior, or failure conditions is provided.

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 clearly states the action ('Remove') and the resource ('a node from bookmarks'), which distinguishes it from deleting the node itself. It does not explicitly differentiate from delete_node or add_bookmark, but the phrase 'from bookmarks' provides reasonable clarity.

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?

The description implies the tool should be used when a node needs to be removed from bookmarks, but it does not explicitly state when not to use it or mention alternatives like add_bookmark or delete_node. Usage context is present but not fully developed.

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

search_nodesA

Full-text search across all nodes.

Args: query: Search term (case-insensitive). max_results: Max results.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
max_resultsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are present, so the description must carry the safety/behavior burden. It adds 'case-insensitive' and the 'all nodes' scope, which are useful. However, it does not describe what is searched (content vs. titles), result shape, ordering, or any limitations, leaving important behavior implicit.

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?

The description is compact and front-loaded with the core behavior before the parameter list. Each sentence or line adds useful information; there is 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?

Given the low parameter count, flat schema, and presence of an output schema, the description covers the essentials needed to invoke the tool. It is slightly incomplete regarding search scope (content vs. metadata) and result behavior, but these do not block basic correct invocation.

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 0%, so the description compensates by restating each parameter with meaning: query is a case-insensitive search term and max_results is the result cap. It does not add constraints like bounds or ordering, but for two flat parameters this is adequate.

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?

Clearly states the action ('search'), the target ('all nodes'), and the mode ('full-text'). This distinguishes it from sibling list/read/create tools, so an agent can pick it for content search rather than listing or fetching.

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 when-to-use or alternative guidance is given. There is no mention of when search_nodes should be preferred over list_nodes or read_node, nor any exclusion or condition. The intended use is only implied by the name and 'full-text search' phrase.

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

update_node_contentA

Update content of a node.

WARNING: With append=False this REPLACES all body content (text, codeboxes, images, tables). Use append=True to safely add content at the end.

Returns: Confirmation message followed by byte-by-byte audit report. On XML parse failure, backup is restored automatically (ROLLBACK).

Args: node_id: Node ID. content: Plain text to set or append (ignored if content_xml is set). content_xml: Raw CherryTree XML body — supports full formatting. Accepts any combination of: segments with formatting attributes (weight="heavy" for bold, foreground="#RRRRGGGGBBBB", background, style="italic", underline="single", strikethrough="true", scale="h1"-"h6"|"small"|"sup"|"sub", family="monospace", justification, link="webs URL"|"node UID"|"file BASE64"|"fold BASE64", indent), (char_offset, syntax_highlighting, frame_width, frame_height), (char_offset, col_widths, with rows/cells), (char_offset, anchor, filename, link). char_offset = position in concatenated plain text of all where the widget renders; each widget occupies exactly 1 char. append: True = append, False = replace.

ParametersJSON Schema
NameRequiredDescriptionDefault
appendNo
contentNo
node_idYes
content_xmlNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description shoulders the full transparency burden. It explicitly discloses the destructive replacement behavior, the automatic ROLLBACK on XML parse failure, and the byte-by-byte audit report return. These are non-obvious consequences an agent must know before calling the 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?

The warning is front-loaded, and the Args section is cleanly organized. Although the content_xml portion is long, every detail is load-bearing for correct invocation, such as link formats, char_offset behavior, and supported widget attributes. There are no filler sentences.

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?

The description covers destructive behavior, rollback safety, return shape, and all parameter semantics. Since an output schema exists, it correctly avoids re-detailing return values. The combination of the warning, append/replace explanation, and full XML spec gives an agent everything needed to invoke the tool correctly.

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 fully compensate. It does: node_id, content, content_xml, and append each receive meaningful prose definitions, including the precedence rule for content vs content_xml and a detailed specification of accepted XML elements, formatting attributes, and char_offset semantics. This adds substantial value beyond the bare 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?

The description opens with 'Update content of a node,' a specific verb-plus-resource statement, and further clarifies scope by explicitly distinguishing body content (text, codeboxes, images, tables) from general node attributes. This separates it from sibling tools like update_node_properties without requiring an agent to inspect schemas.

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?

The description gives clear operational guidance: 'Use append=True to safely add content at the end' and warns that append=False destroys existing content. It also clarifies that content is ignored when content_xml is set. It does not explicitly name sibling alternatives for specialized appends, but the relevant call-mode guidance is direct and actionable.

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

update_node_propertiesA

Update node properties (name, tags, icon, etc.).

Args: node_id: Node ID. name: New title. tags: New tags. is_bold: Bold title. foreground: Title color hex. custom_icon_id: Icon ID. readonly: Read-only flag.

Returns: Confirmation message followed by byte-by-byte audit report. On XML parse failure, backup is restored automatically (ROLLBACK).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
tagsNo
is_boldNo
node_idYes
readonlyNo
foregroundNo
custom_icon_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior4/5

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

With no annotations, the description carries the transparency burden. It adds useful behavioral detail beyond the name by describing the confirmation-plus-audit response and the automatic rollback on XML parse failure. It does not cover permissions or side effects on child nodes, so it stops short of 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.

Conciseness4/5

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

The description is compact, well-structured with Args and Returns sections, and front-loaded with the core purpose. Every sentence contributes useful information, though 'etc.' is slightly vague and the Args list partially duplicates schema property names.

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?

The description covers all parameters, the response format, and rollback behavior, which is good for a mutation tool. However, it leaves important ambiguity around optional null values (whether null means 'do not update' or 'clear the property') and does not specify tags format or icon ID constraints. For a 7-parameter mutation with no annotations, this is a meaningful 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 description coverage is 0%, so the parameter list in the description is essential. It gives meaningful labels to all seven arguments, including useful specifics like 'foreground: Title color hex' and 'readonly: Read-only flag'. Some entries such as 'tags: New tags' remain terse, but the description largely compensates for the schema's lack of documentation.

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 clearly identifies the operation as updating node properties and lists representative fields (name, tags, icon). It distinguishes from the sibling update_node_content by focusing on metadata/properties rather than content, though it does not name the sibling explicitly.

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 guidance about when to use this tool versus update_node_content or other siblings. The description implies use for property changes, but does not state exclusions, prerequisites, or when an alternative would be more appropriate.

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. 13 tool updatesv0.1.0
    • First observedadd_bookmark
    • First observedappend_codebox_to_node
    • First observedcreate_node
    • First observedcreate_node_with_codebox
    • First observeddelete_node
    • First observedlist_bookmarks
    • First observedlist_nodes
    • First observedmove_node
    • First observedread_node
    • First observedremove_bookmark
    • First observedsearch_nodes
    • First observedupdate_node_content
    • First observedupdate_node_properties

TDQS

A4/5.0

Scored across 13 tools

Disambiguation4/5

Most tools target distinct actions (list, read, search, create, update, delete, move, bookmark), so an agent can generally select correctly. The only mild overlap is create_node and create_node_with_codebox, since create_node can also embed codeboxes via content_xml, but the dedicated helper is clearly specialized.

Naming Consistency5/5

Tool names uniformly follow a verb_noun pattern: list_nodes, read_node, create_node, update_node_content, delete_node, move_node, add_bookmark, remove_bookmark. Even the longer names like append_codebox_to_node and create_node_with_codebox still follow the same predictable convention.

Tool Count5/5

13 tools is a well-scoped set for a CherryTree note-management server, covering reading, searching, writing, structure manipulation, and bookmarks without redundancy or bloat. Each tool earns its place and the count feels balanced for the domain.

Completeness5/5

The tool surface covers the full lifecycle of CherryTree nodes: list, read, search, create (regular and codebox), update content, update properties, append codebox, move, delete, plus complete bookmark management. There are no obvious dead ends for common note-editing workflows.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Full-featured Notion MCP server enabling deep page reading, block editing, snapshot/restore, file uploads, table manipulation, page restore, and destructive page copying.
    33
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server that provides read and write access to an Obsidian vault by interacting directly with markdown files on disk. Supports searching, listing, reading, creating, editing, and appending notes without requiring any Obsidian plugins.
    2,778
    ISC