lazymark
This MCP server exposes tools to programmatically manage a lazymark notes vault, including notes, search, tasks, dates, and the Kanban board.
list_notes: list notes with their path, title, tags, and task count.read_note: read a note's Markdown content by path (absolute or relative to the notes folder; must stay inside it).create_note: create a new note with a given title, optionally empty or from a template, in an existing subfolder; returns its path.search_notes: search all notes for text or an RE2 regex, optionally case-sensitive, with a limit; returns note, line, and context for each match.list_tasks: list tasks with id, text, Kanban column, and done status; filter by column, note path, or pending only.move_task: move a task to another Kanban column by stable id, rewriting only its line and erroring if the note changed on disk.set_task_date: set or remove a task's start or due date in Obsidian Tasks format, rewriting only its line.toggle_task: mark a task done (move it to the done column) or undo it (move it back to the first column), by id or legacy path+line.get_kanban: return the configured Kanban columns in order, each with its cards.
Provides integration with Obsidian-compatible markdown vaults. It supports Obsidian-style wikilinks, tags, Obsidian Tasks date formats (Dataview and emoji), daily notes, templates, and a Kanban board stored in task lines. Agents can create, read, list, and search notes, manage tasks, move tasks between columns, set start/due dates, and toggle task completion while preserving Obsidian-friendly markdown.
lazymark
Lazy markdown notes, tasks and a Kanban board in your terminal.
Plain markdown files. Keyboard and mouse. Inline images.
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 mcpSee docs/cli.md for the commands, the JSON schema, the exit codes and the MCP tools.
Links between notes
[[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.
Search
/ 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  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
#tagin 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 migrateDataview
[start:: 2026-10-05] [due:: 2026-10-09]--to dataviewTasks (the default of the plugin)
a small emoji icon before each date (a calendar for the due date)
--to emojiThe 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 andon completionare 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#tagsare. 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@latestFrom source
git clone https://github.com/MathiasDrizzy/lazymark.git
cd lazymark
go build -o lazymark ./cmd/lazymarkHomebrew (macOS)
brew install mathiasdrizzy/tap/lazymarkPrebuilt binaries for macOS, Linux and Windows are on the Releases page.
Quick start
Run
lazymark. It opens~/Documents/notes, creating it if needed. Uselazymark --dir <folder>for another folder, or pick one later in Settings.Press
c, type a name and pressEnterto create a note. Presseto write in your editor ($EDITOR,microif it is not set).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 |
| Next panel |
| Jump to a panel |
| New note / New folder |
| Rename / Move / Delete |
| Toggle a task / Dates (Tasks panel and Kanban) |
| Kanban board |
| Search / Daily note |
| Keybindings / Settings / Trash |
| 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 |
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, orlazymark pastefrom an editor) needsosascriptorpngpaste(macOS),wl-pasteorxclip(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
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 toolscreate_noteB
Creates a new note (from the template, or with just its title if empty is true) and returns its path.
| Name | Required | Description | Default |
|---|---|---|---|
| empty | No | If true, the note only has its title. | |
| title | Yes | Title of the note. | |
| folder | No | Subfolder of the notes folder to create it in (optional; it must exist). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| column | No | Optional: only the tasks in this column (its id, such as todo, doing or done). | |
| note_path | No | Optional: only the tasks of this note. | |
| pending_only | No | If true, leaves out the finished tasks. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Stable task id (the `id` field of list_tasks and get_kanban): <note.md>#<hash>. | |
| column | Yes | Id of the destination column (get_kanban shows the existing ones). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose the 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of matches (default 500). | |
| query | Yes | The text to search for, or a regular expression if regex is true. | |
| regex | No | If true, query is a regular expression (RE2). | |
| case_sensitive | No | If true, the search is case-sensitive. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Stable task id (the `id` field of list_tasks and get_kanban): <note.md>#<hash>. | |
| date | Yes | The date YYYY-MM-DD (it must exist in the calendar), or "none" to remove it. | |
| field | Yes | start (start date) or due (due date). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Stable task id (the `id` field of list_tasks and get_kanban): <note.md>#<hash>. | |
| line | No | Previous form: line of the task, from 1 (with path). | |
| path | No | Previous form: path of the note (with line). |
TDQS
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.
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.
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.
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.
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.
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.
7 tool updates
v0.9.5- Changed
create_note3 fields changed- changed
Input schema / properties / empty / descriptionPrevious value: -"Si es true, la nota solo lleva su título."New value: +"If true, the note only has its title." - changed
Input schema / properties / folder / descriptionPrevious 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)." - changed
Input schema / properties / title / descriptionPrevious value: -"Título de la nota."New value: +"Title of the note."
- Changed
list_tasks3 fields changed- changed
Input schema / properties / column / descriptionPrevious 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)." - changed
Input schema / properties / note_path / descriptionPrevious value: -"Opcional: solo las de esta nota."New value: +"Optional: only the tasks of this note." - changed
Input schema / properties / pending_only / descriptionPrevious value: -"Si es true, omite las tareas hechas."New value: +"If true, leaves out the finished tasks."
- Changed
move_task2 fields changed- changed
Input schema / properties / column / descriptionPrevious 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)." - changed
Input schema / properties / id / descriptionPrevious 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>."
- Changed
read_note1 field changed- changed
Input schema / properties / path / descriptionPrevious 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."
- Changed
search_notes4 fields changed- changed
Input schema / properties / case_sensitive / descriptionPrevious value: -"Si es true, distingue mayúsculas de minúsculas."New value: +"If true, the search is case-sensitive." - changed
Input schema / properties / limit / descriptionPrevious value: -"Máximo de coincidencias (por defecto 500)."New value: +"Maximum number of matches (default 500)." - changed
Input schema / properties / query / descriptionPrevious 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." - changed
Input schema / properties / regex / descriptionPrevious value: -"Si es true, query es una expresión regular (RE2)."New value: +"If true, query is a regular expression (RE2)."
- Changed
set_task_date3 fields changed- changed
Input schema / properties / date / descriptionPrevious 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." - changed
Input schema / properties / field / descriptionPrevious value: -"start (inicio) o due (vencimiento)."New value: +"start (start date) or due (due date)." - changed
Input schema / properties / id / descriptionPrevious 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>."
- Changed
toggle_task3 fields changed- changed
Input schema / properties / id / descriptionPrevious 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>." - changed
Input schema / properties / line / descriptionPrevious value: -"Forma anterior: línea de la tarea, desde 1 (con path)."New value: +"Previous form: line of the task, from 1 (with path)." - changed
Input schema / properties / path / descriptionPrevious value: -"Forma anterior: ruta de la nota (con line)."New value: +"Previous form: path of the note (with line)."
9 tool updates
v0.1.0- First observed
create_note - First observed
get_kanban - First observed
list_notes - First observed
list_tasks - First observed
move_task - First observed
read_note - First observed
search_notes - First observed
set_task_date - First observed
toggle_task
TDQS
Scored across 9 tools
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.
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.
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.
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
Related MCP Connectors
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
Google Keep-style notes app with an MCP server for AI agents to read/write notes.
Serve a folder of Markdown notes as an MCP server: hybrid search, reading, and sourced answers.
MCP-native open-source Notion alternative: read & write pages, databases and kanban boards.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceMCP server that enables full-text search and link navigation over Markdown files as a knowledge graph.-
- AlicenseNot gradedqualityCmaintenanceMCP server for AI agents to read, write, and organize notes in a local-first, human-in-the-loop note-taking app.1 npm2MIT
- FlicenseAqualityBmaintenanceA local MCP server for managing Markdown notes, enabling create, list, read, search, summarize, and delete operations through natural language.61-
- AlicenseBqualityCmaintenancePython MCP server for programmatic access to markdown-based knowledge vaults, enabling AI assistants to browse, read, search, update, and manage notes, tasks, and projects.481MIT