Skip to main content
Glama

lazymark

Lazy markdown notes, tasks and a Kanban board in your terminal.

Plain markdown files. Keyboard and mouse. Inline images.

CI Go version License: MIT

Obsidian compatibility · Install · Quick start · Keys · Configuration

Why lazymark

  • Your notes stay yours. They are plain markdown files in one folder. Edit them with any editor; lazymark only rewrites the line you change and never overwrites a note that changed outside it.

  • Learn it by looking at it. Panels, rounded borders and a bar of keys at the bottom. Press ? for the keys of the panel you are in.

  • Keyboard or mouse. Every action has a key. You can also click rows and the keys in the bottom bar, drag the divider between the columns and use the scroll wheel.

  • Tasks come from your notes. The Tasks panel lists the checkboxes you already wrote, and ticking one changes only that line.

  • Safe by default. Deleted notes go to a trash for 20 days, and folders with content always ask first.

Related MCP server: Bruin

What it does

Notes and folders

One tree for folders and notes. Create, rename, move and delete with a single key; the cursor lands on what you just created.

Templates and the daily note

Put notes in a templates/ folder and start new ones from them with C; {{date}}, {{time}} and {{title}} are filled in. T opens today's note, journal/YYYY-MM-DD.md, made from templates/daily.md the first time; lazymark daily does the same from the shell. See docs/templates.md.

Tasks

Every - [ ] and - [x] in your notes, in one list. Space ticks a task and rewrites only its line; H hides the finished ones. The preview shows the note at the task's line.

Dates

Select a task, in the Tasks panel or on the board, and press d. A small popup asks for Start and Due: type a date the way you say it (2026-10-09, today, tomorrow, +3d, +1w or a weekday such as friday, in your interface language) and the resolved date appears next to the field before you save. Leave a field empty to remove that date, Esc cancels. On the board, clicking the dates of a card opens the same popup. From the shell, lazymark task due <id> 2026-10-09 and lazymark task start <id> … do the same.

The completion date is added by itself when you tick a task. On screen the dates are monochrome glyphs (never emoji) in the color of their state, taken from the theme's palette: overdue in red, due soon (today, or the next N days) in the warning color, on time in the accent color, and completed in green. Turn the colors off with Date colors in Settings (,) or date_colors in the config, set how many days ahead counts as "due soon" with due_soon_days, and pick the color of each state in Settings; see docs/configuration.md. If you set a start date after the due date, the popup warns you (and saves anyway).

In the file the dates go at the end of the task line, in a format that Obsidian Tasks understands. By default lazymark writes the Dataview format ([due:: 2026-10-09], plain ASCII, so it looks the same in any editor and on GitHub), and it always reads both that and the emoji format of Obsidian Tasks, including scheduled and created dates. To write the emoji format instead, set Date format in Settings (,) or date_format in the config. A vault that already has emoji dates and none in Dataview keeps writing emojis (lazymark tells you once, so formats do not get mixed). A task you edit keeps the format its line already had.

To use Dataview dates in Obsidian, open the Tasks plugin settings and set Task format to Dataview; Obsidian Tasks reads one format at a time, so after that it will not read the emoji ones. To convert the notes you already have, run lazymark dates migrate --to dataview --dry-run to see the change and then without --dry-run to apply it (--to emoji goes back). It is never automatic, only touches task lines, writes each note atomically and a second run changes nothing. More in docs/cli.md.

Categories

Every #tag in your notes. Enter on a tag shows only the notes that have it.

Kanban board

Each task is a card with a rounded border: its text (up to 2 lines), its note and its dates (set them with d, see Dates). Settings has "Cards: rectangles | compact" for the one-row view.

The same tasks as columns: To Do, In Progress and Done by default. Move a card with H and L or Shift+← and Shift+→, or drag it with the mouse to another column: the card and the target column are highlighted while you drag, Esc cancels. Inside a column, K and J (or Shift+↑ and Shift+↓) move a card up and down, and dragging it over another card of the same column does the same: it swaps the two tasks (each with its subtasks) in the note, so it works between sibling tasks of the same note; across different notes the cards always follow the order of the notes. The change is written back to the note, on that line only, and never over a note that changed outside lazymark (it reloads and tells you). Kanban (W) opens the board, Notes (W) and ← Notes (Esc) go back, and the bottom bar lists what the selected card can do.

The column is a tag at the end of the task line, so it works in any editor: - [ ] write report #kb/doing. Set your own columns (2 to 6) in the config:

"kanban_columns": [
  {"id": "todo", "titles": {"en": "To do", "es": "Por hacer"}},
  {"id": "doing", "title": "Writing"},
  {"id": "review"},
  {"id": "done"}
]

CLI and MCP

Everything the board does is available without the interface, with a stable --json output and exit codes, and over MCP for agents:

$ lazymark task list --pending --json
$ lazymark task move projects/plan.md#16de6420 doing
$ lazymark note new "Meeting" --folder work
$ claude mcp add --transport stdio lazymark -- lazymark mcp

See docs/cli.md for the commands, the JSON schema, the exit codes and the MCP tools.

[[note]] and [[note|alias]] link notes the way Obsidian does. In the preview they are underlined, n and N move between them, Enter or a click follows one (a link to a note that does not exist offers to create it), and the end of the preview lists the notes that link to this one. Renaming a note offers to update the links that point to it, showing the lines that change. See docs/links.md.

/ searches all the notes as you type and jumps to the match; lazymark search and the MCP tool search_notes do the same without the interface (see docs/cli.md).

Inline images

Images in a note show up in the preview, in place, in terminals that support the Kitty graphics protocol. Ctrl+V pastes the image on your clipboard into the note, and pasting a copied image file imports it.

Settings and themes

Press ,. The interface speaks eight languages (English, Spanish, Brazilian Portuguese, French, German, Italian, Japanese and Simplified Chinese) and starts in yours; docs/i18n.md says which translations a native speaker has reviewed. Fourteen themes (Catppuccin ×4, Tokyo Night, Gruvbox, Nord, Dracula, One Dark, Rosé Pine, Kanagawa, Everforest, Solarized Dark and Light), changed live, and the whole interface follows them, including the markdown preview. Screen background is theme by default and paints the whole screen with the theme's base color; terminal keeps your terminal's background, so a translucent terminal stays translucent. You can also pick the notes folder here.

Paste images from your editor

Copy a screenshot, or an image file in the file manager, open the note in micro, vim or GNU nano and press one key: the ![](assets/…) reference lands at the cursor and the image is saved next to the note. lazymark editor-plugins install sets it up; the keys are Alt-i in micro, \ip in vim and Alt-7 in nano (on macOS terminals, set Option to act as Alt). The GIF runs micro's pasteimage command, which Alt-i also runs. The nano that ships with macOS is Pico and has no key bindings: use GNU nano (brew install nano). See docs/editor-plugins.md.

Obsidian compatibility

A lazymark notes folder is an Obsidian vault: open the same folder in both and they work on the same files. lazymark never adds a hidden folder or a database, and it does not touch the .obsidian folder.

What lazymark reads and writes the way Obsidian does:

  • Wikilinks: [[note]], [[note|alias]], [[note#Heading]], [[note#^block]] and [[folder/note]]. Renaming a note or a folder offers to update the links that point to it (docs/links.md).

  • Tags: every #tag in a note, and nested ones such as #project/web.

  • Tasks: - [ ] and - [x] lines, nested at any depth.

  • Task dates of the Obsidian Tasks plugin, in both of its formats. It always reads both, mixed in the same vault if you like:

    Task format in Obsidian Tasks

    How the dates look in the file

    lazymark dates migrate

    Dataview

    [start:: 2026-10-05] [due:: 2026-10-09]

    --to dataview

    Tasks (the default of the plugin)

    a small emoji icon before each date (a calendar for the due date)

    --to emoji

    The fields are start, due, completion, scheduled and created. lazymark writes the format you choose in Settings (,) → Date format (date_format): Dataview by default, plain ASCII that looks the same in any editor and on GitHub. A vault that already has emoji dates and none in Dataview keeps writing emojis, and lazymark tells you once how to change it.

Which one to pick. In Obsidian open Settings → Tasks → Task format and choose the same one in lazymark. Obsidian Tasks reads one format at a time and has no tool to convert a vault, so if the two do not match, Obsidian will not see the dates lazymark writes. To convert the notes you already have:

lazymark dates migrate              # no --to: says how many tasks use each format and what to try
lazymark dates migrate --to dataview --dry-run   # shows the change, writes nothing
lazymark dates migrate --to dataview             # applies it (--to emoji goes back)

It is never automatic, only touches task lines (not paragraphs, code blocks or the front matter), writes each note atomically and a second run changes nothing. Then set the same Task format in Obsidian.

What is not compatible, so you are not surprised:

  • Priorities, recurrence (every week), dependencies and on completion are not interpreted. They stay in the line, untouched and shown as text; ticking a recurring task does not create the next one.

  • Tasks and Dataview query blocks are not run: they show as the code they are.

  • Tags in the front matter (tags: [x]) are not read as categories; only inline #tags are. The front matter itself is never modified.

  • Embeds (![[file]]), canvases, callouts, plugins and the graph view are not supported.

Install

Install a Nerd Font in your terminal for the folder and note icons. Building needs Go 1.27.1 or newer.

With Go

go install github.com/MathiasDrizzy/lazymark/cmd/lazymark@latest

From source

git clone https://github.com/MathiasDrizzy/lazymark.git
cd lazymark
go build -o lazymark ./cmd/lazymark

Homebrew (macOS)

brew install mathiasdrizzy/tap/lazymark

Prebuilt binaries for macOS, Linux and Windows are on the Releases page.

Quick start

  1. Run lazymark. It opens ~/Documents/notes, creating it if needed. Use lazymark --dir <folder> for another folder, or pick one later in Settings.

  2. Press c, type a name and press Enter to create a note. Press e to write in your editor ($EDITOR, micro if it is not set).

  3. Press ? any time to see the keys.

Keys

The essentials. ? shows the keys of the panel you are in, and docs/keybindings.md has all of them.

Keys

Action

↑ ↓

Up / Down

Tab

Next panel

1 2 3 4

Jump to a panel

c F

New note / New folder

r m d

Rename / Move / Delete

Space d

Toggle a task / Dates (Tasks panel and Kanban)

W

Kanban board

/ T

Search / Daily note

? , x

Keybindings / Settings / Trash

q

Quit

Configuration

Most things are in Settings (,) and are saved at once. They live in a config.json in your user configuration folder (~/Library/Application Support/lazymark/ on macOS, ~/.config/lazymark/ on Linux, %AppData%\lazymark\ on Windows). A file with only what you want to change is enough:

{
  "theme": "tokyo-night",
  "editor": "code --wait",
  "screen_background": "theme",
  "popup_background": "none"
}

Almost everything lazymark does its own way can be changed or turned off: the date warnings and colors, the mascot and its click me!, the trash days (or no trash), where the daily notes and templates live, the prefix of the board tag, the order of the Notes and Tasks panels and the glyph of each date field. See docs/configuration.md for every setting, the command line and the commands for scripts and other tools (lazymark task list, lazymark mcp, and more). If you write in micro, vim or nano, docs/editor-plugins.md shows how to paste a copied image into the note from the editor.

Compatibility

Status

macOS

Developed and tested here, including the interface.

Linux

Builds, and its tests run on every change, and its interface tests (a terminal emulator driving the real binary) also run in a Linux container. Not used interactively by the author yet.

Windows

Builds, and its tests run on every change. Not used interactively by the author yet; docs/windows.md has a checklist to try it by hand.

Terminal

Inline images

Ghostty

✓ tested

Kitty, WezTerm

✓ support the protocol, not tested

Any other

✗ each image shows as [image: name.png]

Limitations:

  • Tasks are the list items that start with - [ ] or - [x] (also *, + and numbered), nested at any depth; code blocks are ignored.

  • The Kanban board has 2 to 6 columns, in the order of your config; cards can be reordered only among tasks of the same note.

  • Pasting an image from the clipboard (Ctrl+V, or lazymark paste from an editor) needs osascript or pngpaste (macOS), wl-paste or xclip (Linux) or PowerShell (Windows).

  • The editor plugins need micro, vim or GNU nano; nano also needs the note to be opened from lazymark.

  • The terminal must be at least 60 columns by 20 rows.

Contributing

Issues and pull requests are welcome. Run go test ./... before sending a change, and git config core.hooksPath scripts/hooks to run gofmt, go vet and the tests before every commit. CI runs on Linux, macOS and Windows.

The GIFs are made from the tapes in assets/readme, so they can be redone with vhs.

License

MIT

The mascot

When there is nothing to show in the preview (an empty notes folder, an empty folder or an empty note), a small sloth sleeps at the bottom right of the panel. Click it and it wakes up and plays an animation (it waves, dances, jumps or spins); each click plays the next one. If you leave lazymark alone for about 20 seconds, a faint click me! shows above it for 15 seconds, and again every minute while you stay away, just so you find out it can be clicked. It never appears while you are working, and after your first click on the sloth it does not come back during that session. It needs the mouse (not --no-mouse) and a terminal at least 60 columns wide. To turn the sloth off, set Mascot to off in Settings (,) or mascot = false in the config.

Available Tools

9 tools
create_noteB

Creates a new note (from the template, or with just its title if empty is true) and returns its path.

ParametersJSON Schema
NameRequiredDescriptionDefault
emptyNoIf true, the note only has its title.
titleYesTitle of the note.
folderNoSubfolder of the notes folder to create it in (optional; it must exist).

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description must carry the behavioral burden; it usefully discloses that notes are created from a template unless empty=true and that the path is returned. However, it omits important behavior for a write operation: what happens if a note with that title already exists, whether creation requires auth, and error conditions.

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?

A single well-formed sentence that front-loads the core action and parenthetically qualifies it, with zero wasted wording.

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 simple 3-parameter tool with fully documented parameters, the description is nearly adequate and helpfully states the return value in the absence of an output schema. It still leaves duplicate-title handling and failure modes unstated, which matters for a creation tool with no annotations.

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

Parameters3/5

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

Schema coverage is 100%, so all three parameters are already documented in the schema, and the description largely restates the 'empty' semantics. It adds only marginal value (the template-vs-title-only framing) beyond the structured field descriptions, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb (creates) and resource (note), plus the two modes of creation and the return value. The create action is clearly distinct from the read/list/search siblings, though no sibling is named 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?

The description explains the meaning of the 'empty' flag but gives no guidance on when to use this tool versus alternatives, nor any prerequisites or exclusions. An agent gets no routing help beyond the obvious verb.

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

get_kanbanA

Returns the Kanban board: the configured columns, in order, each with its cards.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. 'Returns' implies a read-only operation and it discloses the shape of the returned board (ordered columns containing cards), which partially compensates for the absent output schema. However, it says nothing about permissions, empty-board behavior, or data freshness.

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?

A single front-loaded sentence that names the resource first and then adds the one detail that matters (return structure). No filler, no 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 zero-parameter read tool with no output schema, the description supplies the key return-shape information (ordered columns, each with its cards) that would otherwise be unknown. Only minor gaps remain, such as what an unconfigured board returns.

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 tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. The description correctly avoids inventing parameter behavior that does not exist.

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

Purpose4/5

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

States a specific verb and resource ('Returns the Kanban board') and even characterizes the payload structure (configured columns, in order, each with its cards). It is clearly distinct from the note/task siblings that make up the rest of the toolset, though it does not explicitly name any of them.

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 statement of when to use this tool versus alternatives such as list_tasks, nor any prerequisites or exclusions. The agent must infer usage purely from the name and the single-sentence description.

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

list_notesB

Lists the Lazymark notes with their path, title, tags and number of tasks.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It implies a read operation and describes returned fields, but does not state whether the operation is read-only, whether it paginates, how many notes are returned, or any performance or scope constraints.

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 efficient sentence that front-loads the verb and resource and then the returned data. No wasted words.

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 zero-parameter list tool with no output schema and no annotations, the description is adequate but incomplete. It gives no behavioral context (read-only? pagination? scope?) and does not distinguish itself from search_notes, leaving gaps an agent may need filled.

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?

Parameter count is 0 and schema coverage is 100%, so the baseline is 4. The description adds relevant context by enumerating the fields each listed note will contain, which is useful even though no parameters exist.

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 verb 'Lists' and the resource 'Lazymark notes', and enumerates the returned fields (path, title, tags, task count). It does not explicitly differentiate from search_notes, but the enumerated output fields hint at the list vs. search distinction without naming the sibling.

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?

No explicit when-to-use or when-not-to-use guidance is present. The listing behavior and returned field set imply a browsing use case, but an agent must infer that search_notes is the alternative for filtered lookups.

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

list_tasksB

Lists the tasks with their id, text, board column and whether they are done.

ParametersJSON Schema
NameRequiredDescriptionDefault
columnNoOptional: only the tasks in this column (its id, such as todo, doing or done).
note_pathNoOptional: only the tasks of this note.
pending_onlyNoIf true, leaves out the finished tasks.

TDQS

B3.2/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the full burden. It does disclose the shape of each returned task, which is genuinely useful for a tool with no output schema, but it says nothing about read-only safety, result limits, pagination, or ordering, leaving real behavioral gaps.

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

Conciseness4/5

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

A single front-loaded sentence with no filler; the field enumeration earns its place because there is no output schema. It is efficient rather than padded.

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 simple read-only, zero-required-parameter list tool with full schema coverage, describing the returned fields adequately compensates for the absent output schema. Missing usage routing and pagination notes 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.

Parameters3/5

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

Schema description coverage is 100%, so all three optional filters (column, note_path, pending_only) are already documented in the schema itself. The description adds no syntax, format, or combination semantics beyond that, which is the expected baseline when the schema does the heavy lifting.

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

Purpose4/5

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

Specific verb+resource ('Lists the tasks') plus the returned fields (id, text, column, done status), which lets an agent distinguish it from get_kanban and list_notes. It stops short of explicitly contrasting itself with the sibling listing tools, so it is clear but not fully differentiated.

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 guidance, no mention of alternatives (get_kanban, search_notes, list_notes), and no statement of prerequisites or context. The only filtering hints live in the schema, not the description.

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

move_taskA

Moves a task to another column of the Kanban board. It only rewrites the task's line; if the note changed on disk in the meantime, it writes nothing and returns an error.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesStable task id (the `id` field of list_tasks and get_kanban): <note.md>#<hash>.
columnYesId of the destination column (get_kanban shows the existing ones).

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses that only the task's line is rewritten and that a concurrent on-disk change causes no write and an error return (optimistic concurrency). It does not mention permissions, auth requirements, or what a successful call returns, leaving modest gaps.

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

Conciseness5/5

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

Two tight sentences with the core action front-loaded and the concurrency caveat immediately after. No filler, no restatement of the title.

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 two-parameter mutation tool with no annotations and no output schema, the description supplies the key operational semantics (partial line rewrite, conflict-triggered error with no write). It could be slightly more complete on success behavior or auth, but nothing essential to invoking it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters (id and column) are already fully documented in the schema, including the id format and where to find column ids. The description adds no parameter-level detail, so baseline 3 applies.

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 (moves) and resource (a task) plus the target domain (another column of the Kanban board), which cleanly separates it from siblings like toggle_task, set_task_date, and get_kanban. An agent can identify the operation without opening 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 Guidelines3/5

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

Usage is only implied by the purpose: it should be used when a task needs to change columns. No explicit when-not conditions or alternatives are named, and no prerequisites (e.g. that the task id must come from list_tasks/get_kanban) are stated, though that is partially covered by the schema.

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

read_noteB

Reads the Markdown content of a note in the notes folder.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesPath of the .md note: absolute or relative to the notes folder (the `id` that list_notes and create_note return works as is). It must be inside it.

TDQS

B3.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It does disclose the read-only nature of the operation and what is returned (Markdown content of a note scoped to the notes folder), but says nothing about behavior for missing paths, paths outside the folder, or large notes.

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

Conciseness4/5

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

A single sentence with no filler, front-loading the verb and resource. It is efficient, though its brevity borders on under-specification for the tool's edge cases.

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?

With no output schema, the description usefully states that the return is the note's Markdown content, which compensates somewhat. However, with no annotations and no error/edge-case behavior described, it is only minimally complete for an agent invoking it.

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

Parameters3/5

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

Schema coverage is 100% and the schema description for 'path' already explains absolute/relative resolution, the notes-folder constraint, and that list_notes/create_note ids work as-is. The description adds no parameter meaning beyond that, so baseline 3 applies.

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 gives a specific verb (reads), resource (a note in the notes folder), and content type (Markdown). It is clearly separable from list_notes, search_notes and create_note, though it never names them 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 when-to-use or when-not guidance and no mention of alternatives such as search_notes for content discovery or list_notes for enumeration. Usage is only weakly implied by the verb 'reads'.

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

search_notesA

Searches text in all the notes (case-insensitive). Returns the note, line and context of each match, ordered by note and line.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of matches (default 500).
queryYesThe text to search for, or a regular expression if regex is true.
regexNoIf true, query is a regular expression (RE2).
case_sensitiveNoIf true, the search is case-sensitive.

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the disclosure burden. It usefully states the default case-insensitive behavior, the ordering ('by note and line'), and the per-match payload, but says nothing about result limits beyond the schema, no-match behavior, or permissions. Reasonable for a read-only search, but incomplete.

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

Conciseness5/5

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

Two tightly packed sentences with no filler; scope and case behavior are front-loaded, and the return shape and ordering land in the second sentence 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?

There is no output schema, but the description compensates by naming the returned fields (note, line, context) and their ordering. For a read-only search tool with full schema coverage, that is nearly enough; only no-match and result-volume behavior are unstated.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters including query, regex, case_sensitive, and limit are already documented. The description's 'case-insensitive' remark reinforces rather than extends the schema, and adds no syntax or format detail, so baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ('Searches text in all the notes') plus a clear scope ('all the notes'), which implicitly separates it from read_note and list_notes. It never names those siblings explicitly, so the differentiation is left to inference.

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

Usage Guidelines3/5

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

Usage is only implied: the phrase 'in all the notes' suggests this is the cross-note lookup versus read_note's single-note retrieval, but there is no explicit when-to-use, when-not-to-use, or alternative named. Mid-tier guidance.

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

set_task_dateA

Sets or removes the start date or the due date of a task, in an Obsidian Tasks format (the configured date format). It only rewrites the task's line. The completion date is handled by moving the task to the done column.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesStable task id (the `id` field of list_tasks and get_kanban): <note.md>#<hash>.
dateYesThe date YYYY-MM-DD (it must exist in the calendar), or "none" to remove it.
fieldYesstart (start date) or due (due date).

TDQS

A3.8/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 does disclose a meaningful behavioral trait: it rewrites only the task's line, which bounds the side effect. It also flags a format dependency (Obsidian Tasks configured date format). It is silent on permissions, failure modes (e.g., invalid or nonexistent date), and the response shape.

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

Conciseness5/5

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

Three short sentences, zero filler, with the core action front-loaded and the scope-limiting and boundary facts following in priority order. Every sentence contributes something an agent can act on.

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 three-parameter mutation tool with full schema coverage, no output schema and no annotations, the description covers the action, the format dependency, the side-effect scope, and the completion-date exclusion. The main remaining gap is that permissions and error behavior are unaddressed.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents all three parameters including the id format, the YYYY-MM-DD / "none" convention, and the start/due enum. The description adds only the format context ('Obsidian Tasks format, the configured date format'), which is marginal on top of the 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 names a specific verb pair (sets/removes) and resource (start date or due date of a task), so an agent immediately knows the operation. It stops short of explicitly naming a sibling tool for the excluded case, referring instead to 'moving the task to the done column' rather than move_task.

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?

It gives an implied use case (setting/removing start or due dates) and one boundary: completion dates are out of scope and handled by a column move. That boundary is useful but is phrased as an aside and never names the alternative tool or states when to prefer this over siblings like toggle_task.

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

toggle_taskA

Marks a task as done (moves it to the done column) or, if it already was, returns it to the first column.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoStable task id (the `id` field of list_tasks and get_kanban): <note.md>#<hash>.
lineNoPrevious form: line of the task, from 1 (with path).
pathNoPrevious form: path of the note (with line).

TDQS

A3.5/5.0
Behavior3/5

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

No annotations exist, so the description carries the full burden. It usefully discloses the two-way state transition (done -> first column on repeat), but says nothing about permissions, whether a completion date or other fields are mutated as a side effect, or error behavior for a mutation tool.

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

Conciseness5/5

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

A single front-loaded sentence that conveys the action and its conditional branch with zero filler. Every clause earns its place.

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

Completeness3/5

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

For a mutation tool with no annotations and no output schema, the description covers the core state change but omits return/error expectations and the id-vs-line/path invocation choice implied by zero required parameters. Adequate but with real gaps.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds no parameter detail and does not clarify the presence of the legacy line/path form versus the preferred id, nor that one form is required even though required count is 0.

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

Purpose4/5

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

States a specific verb (marks done / returns) and resource (task), and spells out the toggle state machine (done column vs first column). It is distinguishable from move_task in spirit, but the description never names move_task or otherwise explicitly contrasts its two-state behavior with arbitrary column moves.

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 'or, if it already was' clause implies when the tool applies (flipping completion state), but there is no explicit when-to-use/when-not guidance and no alternative named despite move_task and set_task_date being siblings. Usage 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.

Tool Schema Changelog

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

  1. 7 tool updatesv0.9.5
    • Changedcreate_note3 fields changed
      • changedInput schema / properties / empty / description
        Previous value: -"Si es true, la nota solo lleva su título."New value: +"If true, the note only has its title."
      • changedInput schema / properties / folder / description
        Previous value: -"Subcarpeta de la carpeta de notas donde crearla (opcional; debe existir)."New value: +"Subfolder of the notes folder to create it in (optional; it must exist)."
      • changedInput schema / properties / title / description
        Previous value: -"Título de la nota."New value: +"Title of the note."
    • Changedlist_tasks3 fields changed
      • changedInput schema / properties / column / description
        Previous value: -"Opcional: solo las de esta columna (su id, como todo, doing o done)."New value: +"Optional: only the tasks in this column (its id, such as todo, doing or done)."
      • changedInput schema / properties / note_path / description
        Previous value: -"Opcional: solo las de esta nota."New value: +"Optional: only the tasks of this note."
      • changedInput schema / properties / pending_only / description
        Previous value: -"Si es true, omite las tareas hechas."New value: +"If true, leaves out the finished tasks."
    • Changedmove_task2 fields changed
      • changedInput schema / properties / column / description
        Previous value: -"Id de la columna destino (get_kanban muestra las que hay)."New value: +"Id of the destination column (get_kanban shows the existing ones)."
      • changedInput schema / properties / id / description
        Previous value: -"Id estable de la tarea (el campo `id` de list_tasks y get_kanban): <nota.md>#<huella>."New value: +"Stable task id (the `id` field of list_tasks and get_kanban): <note.md>#<hash>."
    • Changedread_note1 field changed
      • changedInput schema / properties / path / description
        Previous value: -"Ruta de la nota .md: absoluta o relativa a la carpeta de notas (el `id` que devuelven list_notes y create_note sirve tal cual). Debe quedar dentro de ella."New value: +"Path of the .md note: absolute or relative to the notes folder (the `id` that list_notes and create_note return works as is). It must be inside it."
    • Changedsearch_notes4 fields changed
      • changedInput schema / properties / case_sensitive / description
        Previous value: -"Si es true, distingue mayúsculas de minúsculas."New value: +"If true, the search is case-sensitive."
      • changedInput schema / properties / limit / description
        Previous value: -"Máximo de coincidencias (por defecto 500)."New value: +"Maximum number of matches (default 500)."
      • changedInput schema / properties / query / description
        Previous value: -"El texto a buscar, o una expresión regular si regex es true."New value: +"The text to search for, or a regular expression if regex is true."
      • changedInput schema / properties / regex / description
        Previous value: -"Si es true, query es una expresión regular (RE2)."New value: +"If true, query is a regular expression (RE2)."
    • Changedset_task_date3 fields changed
      • changedInput schema / properties / date / description
        Previous value: -"La fecha AAAA-MM-DD (debe existir en el calendario), o \"none\" para quitarla."New value: +"The date YYYY-MM-DD (it must exist in the calendar), or \"none\" to remove it."
      • changedInput schema / properties / field / description
        Previous value: -"start (inicio) o due (vencimiento)."New value: +"start (start date) or due (due date)."
      • changedInput schema / properties / id / description
        Previous value: -"Id estable de la tarea (el campo `id` de list_tasks y get_kanban): <nota.md>#<huella>."New value: +"Stable task id (the `id` field of list_tasks and get_kanban): <note.md>#<hash>."
    • Changedtoggle_task3 fields changed
      • changedInput schema / properties / id / description
        Previous value: -"Id estable de la tarea (el campo `id` de list_tasks y get_kanban): <nota.md>#<huella>."New value: +"Stable task id (the `id` field of list_tasks and get_kanban): <note.md>#<hash>."
      • changedInput schema / properties / line / description
        Previous value: -"Forma anterior: línea de la tarea, desde 1 (con path)."New value: +"Previous form: line of the task, from 1 (with path)."
      • changedInput schema / properties / path / description
        Previous value: -"Forma anterior: ruta de la nota (con line)."New value: +"Previous form: path of the note (with line)."
  2. 9 tool updatesv0.1.0
    • First observedcreate_note
    • First observedget_kanban
    • First observedlist_notes
    • First observedlist_tasks
    • First observedmove_task
    • First observedread_note
    • First observedsearch_notes
    • First observedset_task_date
    • First observedtoggle_task

TDQS

A3.7/5.0

Scored across 9 tools

Disambiguation4/5

Most tools are clearly distinct by resource and action, especially note operations. However, list_tasks and get_kanban both expose task/board information, and toggle_task overlaps somewhat with move_task, though descriptions clarify intended use.

Naming Consistency5/5

All tool names use snake_case and a consistent verb_noun pattern. The slight variation among verbs like get, read, and list is semantically appropriate and does not create confusion.

Tool Count5/5

Nine tools is well-scoped for a note and Kanban helper. Each tool corresponds to a clear operation without obvious bloat or missing coverage in count.

Completeness3/5

The server covers reading, searching, and listing notes plus several task manipulations. However, it lacks note update/delete or general editing, and has no explicit task creation, deletion, or text update, creating notable dead ends for a note-management domain.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers