Skip to main content
Glama

notes-update

DestructiveIdempotent

Update a note: edit its content, move it to a different folder (set container_id, or null for the inbox), archive/favorite it, or change its tags. This is the tool for moving notes between folders; there is no separate move tool. Required: id (integer). Optional content (exactly one body-mutation mode at a time): title, body (full replace), append_body (appends to existing body), insert_after + insert_body (insert text immediately after a unique anchor snippet from the existing body), insert_before + insert_body (insert before a unique anchor), replace_find (+ optional replace_with) (replace a unique snippet; omit replace_with entirely to delete the snippet). Markdown-structure ops (heading/section/checklist aware — safer than eyeballing a unique snippet on long notes): replace_section + section_body (replace everything UNDER a heading, keeping the heading line); append_to_section + section_body (add content at the END of a section — the safe 'insert under heading' when you don't know its last line); rename_heading + new_heading (rename a heading in place, preserving its level unless new_heading carries its own '#'); check_item / uncheck_item (tick/untick a checklist item by its text, e.g. '- [ ] ship it'). Headings and checklist items must each match exactly one line. Anchor and find snippets must match exactly once; include enough surrounding context to disambiguate. Also optional: summary, source_url. Freshness: verified (boolean — pass true to mark the note re-confirmed as still true right now; only send this after the user has actually confirmed it), review_after (ISO 8601 datetime to time-box the note, or null to clear it). Organization: container_id (move note), archived (boolean — works on your own personal notes and on team notes where you have the editor role; notes in shared containers are owner-only), favorited (boolean). Tags: tag_list (full replace, comma-separated), add_tags, remove_tags. tag_list takes precedence over add_tags/remove_tags. Concurrent edit safety: pass expected_lock_version (the lock_version you saw when you last read the note via notes-get / notes-list / search) whenever you want a stale-write guard. If it doesn't match the current version, the update is rejected with the current state included so you can re-read and re-apply (append_body-only calls are exempt; see expected_lock_version). Surgical edits (append_body / insert_after / insert_before / replace_find) are anchor-based and so don't need expected_lock_version for their body change — but if you also change title / summary / container_id alongside, those fields can still silently overwrite a newer save unless you supply expected_lock_version. Examples: insert under a heading {id: 42, append_to_section: 'Open Questions', section_body: '- Should we ship Friday?'}; replace a section {id: 42, replace_section: '## Status', section_body: 'Shipped 🎉'}; rename a heading {id: 42, rename_heading: 'TODO', new_heading: 'Done'}; tick a checklist item {id: 42, check_item: 'ship it'}; fix a typo {id: 42, replace_find: 'recieved', replace_with: 'received'}; safe full rewrite {id: 42, body: '...', expected_lock_version: 5}. Every edit is recorded as a named, revertable revision attributed to you — use notes-history to see who changed what, and notes-revert to undo a change.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
idYesNote ID (required)
bodyNoNew body content — full replacement. Mutually exclusive with the other body-mutation modes. Pair with expected_lock_version for concurrent-edit safety.
titleNoNew title
summaryNoNew summary
add_tagsNoComma-separated tags to add to existing tags (ignored if tag_list is provided)
archivedNoArchive (true) or unarchive (false) the note. Works on your own personal notes and on team notes where you have the editor role; notes in shared containers can only be archived by their owner.
tag_listNoFull replacement comma-separated tag list (takes precedence over add_tags/remove_tags)
verifiedNoPass true to mark the note re-confirmed as still true as of now (the 'mark verified' affordance). Refreshes verified_at and clears 'stale' status. Only send after the user has confirmed the note is still accurate.
favoritedNoFavorite (true) or unfavorite (false) the note. Personal and team notes.
check_itemNoText of a checklist item to tick (set to '[x]'). Matched case- and whitespace-insensitively; a leading bullet/checkbox in the text is ignored. Must match exactly one item.
source_urlNoNew source URL
append_bodyNoContent to append to the existing body. Mutually exclusive with the other body-mutation modes.
insert_bodyNoText to insert. Must be paired with either insert_after or insert_before. Mutually exclusive with the other body-mutation modes.
new_headingNoNew heading text for rename_heading. The original level is preserved unless this carries its own leading '#' markers.
remove_tagsNoComma-separated tags to remove from existing tags (ignored if tag_list is provided)
container_idNoFolder (container) id to move the note into; pass null to move it to the inbox (remove it from its folder)
insert_afterNoAnchor snippet from the existing body — insert_body is inserted immediately after the unique occurrence. Anchor must match exactly once; include surrounding context to disambiguate.
replace_findNoSnippet to find in the existing body. Must match exactly once. Mutually exclusive with the other body-mutation modes.
replace_withNoOptional replacement for replace_find. Omit it (or pass an empty string) to delete the matched snippet.
review_afterNoISO 8601 datetime after which the note should be treated as stale (time-boxing), or null to clear it.
section_bodyNoThe content for replace_section / append_to_section. Required when either is given.
uncheck_itemNoText of a checklist item to untick (set to '[ ]'). Same matching rules as check_item.
insert_beforeNoAnchor snippet from the existing body — insert_body is inserted immediately before the unique occurrence. Anchor must match exactly once.
rename_headingNoHeading to rename (with or without leading '#'). Pair with new_heading. Heading must match exactly one.
replace_sectionNoHeading whose section content should be replaced (with or without leading '#', e.g. '## Status' or 'Status'). Replaces everything under the heading up to the next same-or-higher-level heading, keeping the heading line. Pair with section_body. Heading must match exactly one.
append_to_sectionNoHeading to append content to (with or without leading '#'). Adds section_body at the END of that section — the safe way to 'insert under a heading'. Pair with section_body. Heading must match exactly one.
expected_lock_versionNoOptional concurrent-edit guard. Pass the lock_version you saw when you last read the note; if it doesn't match the current version, the update is rejected and you should re-read and re-apply. Checked whenever supplied — covers title, summary, container_id, body, anything else — with one exception: when append_body is the call's ONLY edit, a stale value does not reject (a bare append lands at the end of the current body and can't lose anyone's update). That exemption also means an append is not replay-protected: if you retry an identical append-only call whose response you never saw, the text is appended twice, so re-read with notes-get instead of blind-retrying. Surgical body edits without this param still work and remain anchor-safe; supply it any time you want a stale-write guard for the other fields too.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / description
      Previous value: -"Update a note. Supports partial updates — only provided fields are changed. The body-mutation modes (body, append_body, insert_body, replace_find, replace_section, append_to_section, rename_heading, check_item, uncheck_item) are mutually exclusive — supply at most one per call."New value: +"Update a note. Supports partial updates — only provided fields are changed. The body-mutation modes (body, append_body, insert_body, replace_find, replace_section, append_to_section, rename_heading, check_item, uncheck_item) are mutually exclusive — supply at most one per call. Supplying two surgical modes together is an error, but `body` is not checked against them: if you send `body` alongside a surgical mode, `body` wins and the surgical edit is ignored rather than rejected, so never send both."
    • changedInput schema / properties / expected_lock_version / description
      Previous value: -"Optional concurrent-edit guard. Pass the lock_version you saw when you last read the note; if it doesn't match the current version, the update is rejected and you should re-read and re-apply. Checked whenever supplied — covers title, summary, container_id, body, anything else. Surgical body edits without this param still work and remain anchor-safe; supply it any time you want a stale-write guard for the other fields too."New value: +"Optional concurrent-edit guard. Pass the lock_version you saw when you last read the note; if it doesn't match the current version, the update is rejected and you should re-read and re-apply. Checked whenever supplied — covers title, summary, container_id, body, anything else — with one exception: when append_body is the call's ONLY edit, a stale value does not reject (a bare append lands at the end of the current body and can't lose anyone's update). That exemption also means an append is not replay-protected: if you retry an identical append-only call whose response you never saw, the text is appended twice, so re-read with notes-get instead of blind-retrying. Surgical body edits without this param still work and remain anchor-safe; supply it any time you want a stale-write guard for the other fields too."
  2. Changed1 schema field changed
    • changedInput schema / properties / archived / description
      Previous value: -"Archive (true) or unarchive (false) the note. Personal notes only."New value: +"Archive (true) or unarchive (false) the note. Works on your own personal notes and on team notes where you have the editor role; notes in shared containers can only be archived by their owner."
  3. Changed1 schema field changed
    • changedInput schema / properties / container_id / type
      Previous value: -"integer"New value: +[
      +  "integer",
      +  "null"
      +]
  4. Changed2 schema fields changed
    • addedInput schema / properties / review_after
      Added value: +{
      +  "description": "ISO 8601 datetime after which the note should be treated as stale (time-boxing), or null to clear it.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / verified
      Added value: +{
      +  "description": "Pass true to mark the note re-confirmed as still true as of now (the 'mark verified' affordance). Refreshes verified_at and clears 'stale' status. Only send after the user has confirmed the note is still accurate.",
      +  "type": "boolean"
      +}
  5. Changed1 schema field changed
    • changedInput schema / properties / container_id / description
      Previous value: -"Move to this container"New value: +"Folder (container) id to move the note into; pass null to move it to the inbox (remove it from its folder)"
  6. Changed12 schema fields changed
    • changedInput schema / description
      Previous value: -"Update a note. Supports partial updates — only provided fields are changed. Body-mutation modes (body, append_body, insert_body, replace_find) are mutually exclusive."New value: +"Update a note. Supports partial updates — only provided fields are changed. The body-mutation modes (body, append_body, insert_body, replace_find, replace_section, append_to_section, rename_heading, check_item, uncheck_item) are mutually exclusive — supply at most one per call."
    • changedInput schema / properties / append_body / description
      Previous value: -"Content to append to the existing body. Mutually exclusive with body, insert_body, and replace_find."New value: +"Content to append to the existing body. Mutually exclusive with the other body-mutation modes."
    • addedInput schema / properties / append_to_section
      Added value: +{
      +  "description": "Heading to append content to (with or without leading '#'). Adds section_body at the END of that section — the safe way to 'insert under a heading'. Pair with section_body. Heading must match exactly one.",
      +  "type": "string"
      +}
    • changedInput schema / properties / body / description
      Previous value: -"New body content — full replacement. Mutually exclusive with append_body, insert_body, and replace_find. Pair with expected_lock_version for concurrent-edit safety."New value: +"New body content — full replacement. Mutually exclusive with the other body-mutation modes. Pair with expected_lock_version for concurrent-edit safety."
    • addedInput schema / properties / check_item
      Added value: +{
      +  "description": "Text of a checklist item to tick (set to '[x]'). Matched case- and whitespace-insensitively; a leading bullet/checkbox in the text is ignored. Must match exactly one item.",
      +  "type": "string"
      +}
    • changedInput schema / properties / insert_body / description
      Previous value: -"Text to insert. Must be paired with either insert_after or insert_before. Mutually exclusive with body, append_body, and replace_find."New value: +"Text to insert. Must be paired with either insert_after or insert_before. Mutually exclusive with the other body-mutation modes."
    • addedInput schema / properties / new_heading
      Added value: +{
      +  "description": "New heading text for rename_heading. The original level is preserved unless this carries its own leading '#' markers.",
      +  "type": "string"
      +}
    • addedInput schema / properties / rename_heading
      Added value: +{
      +  "description": "Heading to rename (with or without leading '#'). Pair with new_heading. Heading must match exactly one.",
      +  "type": "string"
      +}
    • changedInput schema / properties / replace_find / description
      Previous value: -"Snippet to find in the existing body. Must match exactly once. Mutually exclusive with body, append_body, and insert_body."New value: +"Snippet to find in the existing body. Must match exactly once. Mutually exclusive with the other body-mutation modes."
    • addedInput schema / properties / replace_section
      Added value: +{
      +  "description": "Heading whose section content should be replaced (with or without leading '#', e.g. '## Status' or 'Status'). Replaces everything under the heading up to the next same-or-higher-level heading, keeping the heading line. Pair with section_body. Heading must match exactly one.",
      +  "type": "string"
      +}
    • addedInput schema / properties / section_body
      Added value: +{
      +  "description": "The content for replace_section / append_to_section. Required when either is given.",
      +  "type": "string"
      +}
    • addedInput schema / properties / uncheck_item
      Added value: +{
      +  "description": "Text of a checklist item to untick (set to '[ ]'). Same matching rules as check_item.",
      +  "type": "string"
      +}
  7. Changed1 schema field changed
    • changedInput schema / properties / replace_with / description
      Previous value: -"Text to replace replace_find with. Use an empty string to delete the matched snippet."New value: +"Optional replacement for replace_find. Omit it (or pass an empty string) to delete the matched snippet."
  8. Changed2 schema fields changed
    • changedInput schema / properties / body / description
      Previous value: -"New body content — full replacement. Mutually exclusive with append_body, insert_body, and replace_find."New value: +"New body content — full replacement. Mutually exclusive with append_body, insert_body, and replace_find. Pair with expected_lock_version for concurrent-edit safety."
    • addedInput schema / properties / expected_lock_version
      Added value: +{
      +  "description": "Optional concurrent-edit guard. Pass the lock_version you saw when you last read the note; if it doesn't match the current version, the update is rejected and you should re-read and re-apply. Checked whenever supplied — covers title, summary, container_id, body, anything else. Surgical body edits without this param still work and remain anchor-safe; supply it any time you want a stale-write guard for the other fields too.",
      +  "type": "integer"
      +}
  9. Changed8 schema fields changed
    • changedInput schema / description
      Previous value: -"Update a note. Supports partial updates — only provided fields are changed."New value: +"Update a note. Supports partial updates — only provided fields are changed. Body-mutation modes (body, append_body, insert_body, replace_find) are mutually exclusive."
    • changedInput schema / properties / append_body / description
      Previous value: -"Content to append to the existing body (mutually exclusive with body)"New value: +"Content to append to the existing body. Mutually exclusive with body, insert_body, and replace_find."
    • changedInput schema / properties / body / description
      Previous value: -"New body content — full replacement (mutually exclusive with append_body)"New value: +"New body content — full replacement. Mutually exclusive with append_body, insert_body, and replace_find."
    • addedInput schema / properties / insert_after
      Added value: +{
      +  "description": "Anchor snippet from the existing body — insert_body is inserted immediately after the unique occurrence. Anchor must match exactly once; include surrounding context to disambiguate.",
      +  "type": "string"
      +}
    • addedInput schema / properties / insert_before
      Added value: +{
      +  "description": "Anchor snippet from the existing body — insert_body is inserted immediately before the unique occurrence. Anchor must match exactly once.",
      +  "type": "string"
      +}
    • addedInput schema / properties / insert_body
      Added value: +{
      +  "description": "Text to insert. Must be paired with either insert_after or insert_before. Mutually exclusive with body, append_body, and replace_find.",
      +  "type": "string"
      +}
    • addedInput schema / properties / replace_find
      Added value: +{
      +  "description": "Snippet to find in the existing body. Must match exactly once. Mutually exclusive with body, append_body, and insert_body.",
      +  "type": "string"
      +}
    • addedInput schema / properties / replace_with
      Added value: +{
      +  "description": "Text to replace replace_find with. Use an empty string to delete the matched snippet.",
      +  "type": "string"
      +}
  10. Changed2 schema fields changed
    • changedInput schema / description
      Previous value: -"Update an existing note. Supports partial updates — only provided fields are changed."New value: +"Update a note. Supports partial updates — only provided fields are changed."
    • changedInput schema / properties / append_body / description
      Previous value: -"Content to append to the existing body, separated by a newline (mutually exclusive with body)"New value: +"Content to append to the existing body (mutually exclusive with body)"
  11. Changed7 schema fields changed
    • changedInput schema / description
      Previous value: -"Update an existing note."New value: +"Update an existing note. Supports partial updates — only provided fields are changed."
    • addedInput schema / properties / add_tags
      Added value: +{
      +  "description": "Comma-separated tags to add to existing tags (ignored if tag_list is provided)",
      +  "type": "string"
      +}
    • addedInput schema / properties / append_body
      Added value: +{
      +  "description": "Content to append to the existing body, separated by a newline (mutually exclusive with body)",
      +  "type": "string"
      +}
    • changedInput schema / properties / body / description
      Previous value: -"New body content (Markdown with [[id:Note Title]] wiki-links)"New value: +"New body content — full replacement (mutually exclusive with append_body)"
    • changedInput schema / properties / id / description
      Previous value: -"Note ID"New value: +"Note ID (required)"
    • addedInput schema / properties / remove_tags
      Added value: +{
      +  "description": "Comma-separated tags to remove from existing tags (ignored if tag_list is provided)",
      +  "type": "string"
      +}
    • changedInput schema / properties / tag_list / description
      Previous value: -"New comma-separated tag list"New value: +"Full replacement comma-separated tag list (takes precedence over add_tags/remove_tags)"
  12. First observed

TDQS

A4/5.0
Behavior1/5

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

The description is exceptionally transparent about mutation, revisions, lock_version behavior, destructive snippet replacement, and the append-only idempotency caveat. However, it directly contradicts the annotation idempotentHint=true by stating that append-only calls are not replay-protected and that retrying an identical append can append the text twice. Per the rubric, a direct contradiction with annotations requires a score of 1.

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 appropriately so for a 27-parameter tool. It is logically organized into required params, body-mutation modes, markdown operations, organization, tags, concurrency, and examples, with the core purpose front-loaded and every sentence contributing functional guidance.

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 highly complex mutation tool with no output schema, the description is remarkably complete. It covers concurrency safety, destructive behavior, permissions around archiving, mutual exclusions, matching constraints, and provides concrete examples for the trickiest operations. An agent has enough context to invoke the tool correctly in nearly every documented scenario.

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?

Although schema coverage is 100%, the description adds substantial semantic value beyond the schema: body-mutation modes are grouped and marked mutually exclusive, tag_list precedence over add_tags/remove_tags is stated, 'body wins' over surgical modes is explicitly disclosed, anchor uniqueness rules are explained, and expected_lock_version gets detailed concurrency semantics including the append-only exemption.

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—'Update a note'—and immediately enumerates the distinct actions available: edit content, move folder, archive/favorite, change tags. It explicitly positions itself as the tool for moving notes between folders and notes that there is no separate move tool, clearly differentiating it from sibling tools like containers-update and notes-create.

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 strong contextual guidance: it names this as the move tool, explains when to supply expected_lock_version, and points to notes-history and notes-revert for auditing/undoing. It does not systematically contrast with every sibling mutation tool, but it provides enough routing and scenario-based guidance for an agent to select it correctly.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.