TrailMark
TrailMark’s MCP server lets an agent inspect what the user is reading, explore project Markdown/comments/notes/tags, and show a location or resolve comments—without editing files.
Get the current context: open document, reading/editing mode, on-screen section, selection, and unsaved-edit status.
List unread Markdown documents changed since the user last read them.
Search Markdown sections; narrow by tags and list tags/document metadata.
List comments on Markdown passages (open, done, or all) with anchoring state.
Resolve a comment as done with an optional reply.
List shared notes and read a shared note’s full text.
Open/show a document at a line or heading in TrailMark, starting the app if needed.
Mostly read-only: only
openandresolve_commentare non-read-only; it cannot edit documents or write comments.Several file-backed tools also work when TrailMark is closed.
PerMark
AI speeds the work. Your vision steers it.
A Markdown app to read and review what your AI agents write, and steer the work through its documents. It opens every Markdown file as a clean page, shows what your agents change while they write, and lets you keep or revert each change.
Created and maintained by Edelmar Schneider.
Get PerMark: Microsoft Store (Windows) · GitHub Releases (Windows, macOS, Linux)
Where to start · Try it · Install · Use with an AI agent · Shortcuts · What's new · Contributing
Free and open source (MIT or Apache-2.0) · No account, no telemetry · Windows, macOS and Linux (tested by hand on Windows)
Where to start
Either way, PerMark works with any AI tool, or with none. It follows changes whatever program writes the files: an AI agent, an editor or git. It is a unified document workspace (UDW): Markdown at the center, with the config, data and code files around it.
Related MCP server: mcp-server-markdown
Try it in a minute
Install. Get PerMark from the Microsoft Store or from GitHub Releases.
Open. Choose a folder as a project (
Ctrl+O), or a single.mdfile (Ctrl+Shift+O). It opens in View, as a clean page.Watch. Let your agent write in that folder. Changed passages glow. Press
Ctrl+Shift+Lfor Follow mode, and PerMark opens each document while the agent writes it.
📖 Beautiful to read, easy to edit
Every Markdown file opens as a clean page, with its tables, diagrams, math and properties. Edit it as it looks, and keep notes that save themselves.
A clean page. GitHub-flavored Markdown with tables, task lists, footnotes, alerts and description lists. Code blocks are highlighted for about 190 languages. In a project, links open inside the app, with Back and Forward, like a wiki.
Diagrams and math, written as text. Mermaid and PlantUML diagrams are drawn inside PerMark, with no Java and no server. Math shows as formulas.
Front matter as a properties card. View shows it as a clean card. In Edit, you change its values one by one, and the rest of the file stays as it is.
Made for long reading. A light, dark or system theme, with softer light tones (Paper, Sage, Gray). Three reading widths, an outline to jump between sections, and Focus mode (
Ctrl+Alt+F), which leaves only the page.View, Edit, Source. One switch in the header. View is for reading. Edit changes the page as it looks, with a toolbar and a
/block menu. Source shows the raw file, every byte, with find and replace and go to line. A switch beside the modes draws a Mermaid or PlantUML diagram next to its text while you type (off until you turn it on).Honest about Edit. Edit keeps math, diagrams, HTML and footnotes as written: Edit in Source opens them. Edit does not draw pictures that are files next to the document; View and Source do.
Notes that save themselves. Click Notes, next to Settings, or press
Ctrl+Shift+Nfor a new note from anywhere in PerMark, and type. No name to choose, no folder to pick, no save prompt. Notes are plain Markdown files you own, and Copy puts a drafted prompt on the clipboard as exact Markdown.
⚡ See what your AI writes
See what your AI writes while it writes, and what changed since you last looked.
Changed passages glow. The open document reloads while an agent writes, and keeps your place. Changed blocks glow, and removed blocks leave a marker you can expand.
Live changes. A feed lists every file that changed, one entry per file. Show all changes, only yours, or only those from outside.
Follow mode (
Ctrl+Shift+L) opens the Markdown document being written. It waits while you edit.Unread dots, like mail. A dot marks each Markdown document that changed since you last read it, and folders count them.
Alt+Uopens the next one.Since last visit. One list of what changed while the project was closed: Changed, New or Removed. It compares the content of your documents, so it works without git, and it still shows the changes after the agent has committed.
Worktrees too. Linked git worktrees are found and watched, so agents working in parallel branches show up as well.
PerMark sees the changes in your folder, whatever program makes them. It tells you whether a change came from you or from outside.
✅ Decide what stays
You decide what stays: keep or revert each change, comment on any passage, and share a project with an agent only when you turn it on.
Review, change by change. When a document changed since you last read it, a quiet bar says how many changes there are. Review shows each one in place: block by block in Markdown, line by line in code, logs, data and config files. Choose Keep or Revert for each (
K,R), or for all at once. Compare with what you last read, or with the last commit.Comments an agent can mark done. Select a passage and press
C. With the agent connection on, your agent reads your open comments and marks them done with a reply. Send to agent copies them as a prompt for any agent chat. Comments are yours alone.Only what you changed is saved. Edit and Source rewrite only the blocks you changed. Every other byte stays as its author, or agent, wrote it.
Reload theirs or Keep mine (overwrite). If an agent changes a file while you edit it, you choose, for the whole document.
Git in plain words. Letter badges, with a legend that says what each letter means. Compare with your last visit or with the last commit. PerMark only reads git: it never commits, stages or creates a repository.
Find anything, to the section. Search everywhere (
Ctrl+T) finds files, sections, tags and commands in one box. Give any file tags and a one-line description; the ones you add in the app never touch your files.Links follow your files. Move or rename a file, and PerMark shows each link it will update before it changes them.
Ctrl+Zin the Explorer takes it back.
🧩 Markdown at the center, not alone
Markdown leads, and many files around it open too: config files as clean sheets, data and code, pictures, audio and video.
Config files as clean sheets. TOML, YAML, INI,
.env,.propertiesand ignore files open as sections, keys and values, with comments as captions. Change a value, and only those bytes change. Secret values are masked in the sheet. Sheets edit values, not keys. YAML flow style is read-only, and a file over 256 KB or 3,000 rows shows as plain text.TOON.
.toonfiles, the compact data format made for AI, open as tables and cards and can be edited in place. The Converter turns JSON, XML, YAML, CSV and TOML into TOON or another format, shows the estimated token saving of each choice, and never writes over the original.AI files, recognized.
AGENTS.md,CLAUDE.md,SKILL.md, Cursor rules (.mdc),llms.txt, prompt files, and model and dataset cards open with no setup.Prompt blocks. XML-like prompt tags such as
<context>and<instructions>fold as blocks, and the Markdown inside still renders.{{name}}variables are marked, and@pathreferences link to the file.JSON, XML, code and plain text open with highlighting. A very large text file opens at once.
Pictures, audio and video open in the app (not every audio or video format plays). Other files open with the program your system has for them. Programs and scripts are never run from a click.
Token count: how many tokens a document, a section or a folder takes. Exact for OpenAI's tokenizers, marked as approximate for Claude and Gemini. It asks before it downloads a tokenizer's vocabulary.
Your editor, at the line. A path like
src/main.rs:42that names a file of the project is a link: it opens your own editor at that line.
Many features are plugins, and every plugin is on from the start. Turn off what you do not need in Settings → Plugins; a plugin that is off leaves nothing behind.
Questions people ask
"Git diff already shows me the changes." Git diff compares with the last commit. PerMark also shows what changed since you last read each document, even after the agent has committed, and you keep or revert each change.
"Does it replace my code editor?" No. PerMark is for the documents around the code. Open in external editor takes you to your own editor at the place you are reading.
"What does the agent get, and how do I stop it?" Sharing is off in every project until you turn it on. The agent reads, shows you a place and marks comments done. It never edits through PerMark. Details in Use with an AI agent.
"Does it go online?" No account, no telemetry, no tracking. PerMark goes online only to check for its own updates (installer versions; the Store and snap update it instead), and when you ask: a picture from the web, or the optional token-count vocabulary. Your documents never leave your computer through PerMark. An AI agent you connect is a separate program: what it sends online is up to that agent. The Windows installers may also download Microsoft's WebView2 component while they install, if your computer does not have it.
What PerMark is not
Not a code editor. No completion, refactoring, build, run or debug. Real code work opens in your own editor.
Not an agent. It does not run, host or replace your AI. It shows what your AI writes, and you decide what stays.
Not tested by hand on macOS or Linux. PerMark 0.6 was tested by hand on Windows; the macOS and Linux builds are checked automatically.
Why Markdown
Markdown was made for readers. So is PerMark. It was designed in 2004 so that plain text reads well as it is. Today, AI tools write it too, for the same reason: it is structured enough for a machine and clear enough for a person.
It is also an opinion: many documents that live in Word or PDF today would be better as Markdown. They would be smaller, comparable line by line in git, readable by any AI, and never locked inside one app.
Install
Windows, macOS and Linux. PerMark 0.6 was tested by hand on Windows; the macOS and Linux builds are checked automatically. Installers are not code-signed, so your system shows a warning the first time you install or open it.
System | Get it |
Windows | The Microsoft Store, which keeps PerMark up to date. Or the |
macOS | The universal |
Linux | The |
Copies from GitHub check for updates when they start and once a day, and offer to download and restart. The Microsoft Store and the snap update their copies themselves. PerMark becomes your default app for Markdown only if you choose it: it asks once, with Markdown files checked and other types unchecked. On Windows, you confirm the choice in Windows Settings.
Coming from TrailMark? The command is now permark. If an agent is set up with the old trailmark command, run the setup
lines from Settings → Integration → Agent connection again. PerMark 0.6 no longer renames old .trailmark/ folders: update
to 0.5.8 before you update to 0.6.
permark # start PerMark: your last windows and tabs come back
permark . # open the current folder as a project
permark docs/plan.md # open a single file
permark --notes # open the NotesOn Windows and macOS, permark is not on your PATH after an install from GitHub, so use the full path of the program, or add
it yourself. The Microsoft Store and snap versions put permark on your PATH.
You need Rust, Node.js 24 and the
Tauri prerequisites. The program lives in app/, and app/rust-toolchain.toml pins
the Rust version, which rustup installs for you.
git clone https://github.com/EdelmarSchneider/permark.git
cd permark/app
npm ci
npm run tauri build # or: npm run tauri devUse with an AI agent
PerMark can tell an AI agent what you are looking at, the way a code editor tells it the open file. Say "rewrite this paragraph" or "go through my comments", and the agent knows which document, which section and which words you mean. It works with any tool that speaks the Model Context Protocol (MCP).
What it shares, and how it stays in your hands:
Off until you turn it on, per project. Choose Share this project with agents in Settings → Integration → Agent connection, or run Agent connection: turn on from the command palette. Nothing inside a project can turn it on.
Local. It talks only to programs on your computer and opens no network port.
Read, never edit. The agent sees where you are, what you selected, what changed, your comments and the notes you shared one by one. It reads, shows you a place and marks comments done. It never edits a file through PerMark.
Your limits. You choose what it may do, group by group. Files in
.aiignorenever reach an agent. Secret values are hidden by their key names; a secret inside ordinary text is not recognized, so list such files in.aiignore.Visible. While the connection is on, the status bar shows Agent. Click it to see what is shared and the latest requests.
Connect in two lines. Turn the connection on, then add PerMark to your agent as an MCP server. Settings → Integration → Agent connection shows these lines with the right path for your copy, and a Copy button.
# Claude Code
claude mcp add permark -- "<path to PerMark>" mcp{ "mcpServers": { "permark": { "command": "<path to PerMark>", "args": ["mcp"] } } }The second form fits any other MCP client. With the connection on, Hand off to agent copies one line for your prompt, so the agent asks PerMark what you did instead of rereading the project.
Tool | What it answers or does |
| The open document, whether you are reading or editing, the section on screen, your selection (up to 2,000 characters), whether there are unsaved edits, and how many of your comments are open |
| The documents that changed since you last read them, the newest at the top |
| The files below a folder, by path: approximate size in tokens, flags (unread, changed), and the tags and descriptions you gave them. The place to start in a large project |
| "Where is X described?": ranked sections with path, line, size, snippet and heading, from the same index as Search everywhere. |
| The tags in use, with how many documents have each; or, for one tag, the documents that have it with their descriptions |
| The parts of one file (headings, JSON keys, parts of a config file) with line ranges and sizes, so an agent reads only the part it needs; optionally the links in and out |
| The text of one part of a file: a heading, an anchor, a key path or a range of lines. Long parts continue with a cursor |
| Your open comments, each with the quoted passage, its section and line, and your text |
| Marks a comment done, with an optional short reply that you read under the comment |
| The notes you chose to share with agents, each with its title, when it changed and its size |
| The text of one shared note, by the name |
| What you did in PerMark since you last pressed Hand off to agent (checked against the disk), plus the changes made outside PerMark |
| Shows you a place (a document, a line or a heading) without taking the focus from the agent's terminal, and offers a way back |
Answers are short on purpose: a header line, then tab-separated rows, so an agent spends few tokens. A project's .permark/ folder
can narrow what an agent may do, never widen it. When PerMark is closed, the other tools still work from the files, and open
starts it. With the connection off, every tool says so and explains how to turn it on.
permark context prints where you are as one short line and exits, for tools that can run a command before each prompt:
Viewing docs/plan.md › Plan › Rollout (lines 40-62), selected (lines 44-46): 'ship it on Friday', 2 comments open.In Claude Code, a UserPromptSubmit hook in .claude/settings.json (or your user settings) adds it to every prompt:
{
"hooks": {
"UserPromptSubmit": [
{ "hooks": [{ "type": "command", "command": "\"<path to PerMark>\" context" }] }
]
}
}When there is nothing to say (the connection is off, or PerMark is not open), the command prints nothing, so a hook never adds
noise to a prompt. A project with a .permark/ folder also has .permark/local/agent-context.json while the connection is on:
the same answer as a file, for a script or a tool without MCP. It holds the open document, the section on screen and your
selected text, and any program running as you can read it, as can a folder-sync tool that watches the project. It stays out of git and is deleted when the connection is turned off.
Keyboard shortcuts
The ten that matter most. On macOS, use Cmd where this README says Ctrl (except Ctrl+Tab and Ctrl+Shift+Tab).
Action | Shortcut |
Search everywhere (files, sections, tags, commands) |
|
Quick open a file |
|
Every command |
|
Next unread document |
|
Follow mode |
|
Next / previous change |
|
While you review: keep / revert |
|
Comment on the selected passage |
|
Edit, and back to View |
|
Focus mode: only the page |
|
All of them, and you can change them, in Settings → Keyboard shortcuts.
Reading and navigating
Action | Shortcut |
Search all docs (by section) |
|
Find in page |
|
Show / hide the outline |
|
Show / hide the sidebar (when you are not editing) / the right panel |
|
Cycle the reading width |
|
Back / forward |
|
Copy reference (or selection with reference) |
|
Copy the whole document (View and Source) |
|
Open in your external editor |
|
Zoom in / out / reset |
|
Open a folder / a file |
|
Settings |
|
Edit the open document's tags and description |
|
Tabs
Action | Shortcut |
Next / previous tab |
|
Go to tab 1 to 8 / the last tab |
|
Close the tab |
|
Review
Action | Shortcut |
Keep / revert this change |
|
Next / previous change |
|
Keep all / revert all |
|
Editing
Action | Shortcut |
Open Source mode |
|
Back to View |
|
Save |
|
New file |
|
Bold / italic / strikethrough (Edit) |
|
Bold (Source, in Markdown files) |
|
Link / inline code (Edit) |
|
Headings 1 to 6 (Edit) |
|
Paragraph (Edit) |
|
Block menu (Edit) |
|
Find / replace / go to line (Source) |
|
Notes and the Explorer
Action | Shortcut |
Open the Notes |
|
New note, from anywhere in PerMark |
|
New note (in Notes) |
|
Copy the note's text (in Notes) |
|
Open a pinned note (in Notes) |
|
Rename / delete (to the system trash) |
|
Take back the last file operation (on macOS, a deleted file stays in the Trash) |
|
What's new and ideas being explored
PerMark 0.6 rebuilt the whole program. Every release is in the CHANGELOG.
0.6.2: a Notes button next to Settings, keys to hide and show the side bars, files dropped from your file manager copy into the project or open as tabs, Move to window for a tab, and every plugin on from the start.
0.6.1: every folder, file and Notes gets a tab, and your windows and tabs come back when PerMark starts.
0.6.0: many windows in one app, a full Settings page, a Plugins page and keys you can change.
Config files and TOON as clean sheets, AI files recognized with no setup, and prompt blocks.
Review of code and text files, line by line, with keep or revert.
An agent connection with 13 tools, permission groups,
.aiignoreand Hand off to agent.
Ideas being explored, no promises: a home for structured work with AI, such as spec-driven development, for the projects that want it; ready-made ways of working to adopt, such as Spec Kit templates; and a shared place where people and always-on agents follow and review the work together, with the person in charge.
Tech
PerMark is a Tauri 2 app. The core is written in Rust: rendering (comrak and ammonia), file watching (notify), git (the one on your computer, or a built-in libgit2 when there is none), the search index and the block-preserving saves. The interface is Svelte 5 and TypeScript in the system webview, with CodeMirror 6 (Source) and Milkdown (Edit).
Contributing
Issues and pull requests are welcome. The project uses git-flow (develop for integration, feature/* branches) and a strict
quality gate:
cd app
npm run check # version, rustfmt, prettier, build, clippy -D warnings, svelte-check, cargo test, vitestSee CONTRIBUTING.md before opening a pull request. It also explains how to fix or add a translation.
License
Copyright (c) 2026 Edelmar Schneider. Licensed under either of MIT or Apache-2.0, at your option.
"PerMark" and its logo are trademarks of Edelmar Schneider: forks are welcome under a different name. See TRADEMARKS.md.
Available Tools
9 toolsget_contextARead-only
What the person is looking at in TrailMark right now: the open document (path relative to the project), whether they are reading or editing it, the section on screen (heading path and line range), the text they selected (with its section and lines) and whether it has unsaved edits. Call this when the person says "this", "here", "the selected text", "this section", "what I'm reading" or otherwise points at something on their screen without naming it. Needs TrailMark open on the project with its agent connection on; otherwise it says so.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint=true, it discloses the required runtime state (app open, agent connection active) and that the tool reports when that condition is unmet, which is genuine behavioral context an agent needs. It doesn't cover freshness/caching behavior, so not quite a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is front-loaded: what the tool returns first, then when to call it, then the precondition. The enumeration is dense but each clause carries information; slightly long for a no-argument tool.
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, so the description must describe the returned payload, and it does so field by field (path, mode, heading path, line range, selection, unsaved edits). Combined with the stated precondition, an agent has everything needed to call and interpret 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?
The tool takes zero parameters, so there is nothing for the description to clarify beyond the baseline. The enumeration of returned fields adds value but is not parameter semantics.
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 resource (the person's current TrailMark context) and enumerates exactly what that includes: open document, read/edit mode, on-screen section, selection, and dirty state. This is far more specific than the sibling list_* tools and immediately distinguishes it.
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 explicit trigger conditions with quoted user phrasings ("this", "here", "the selected text", "this section") and states the prerequisite (TrailMark open with agent connection on). No alternative sibling is named as a fallback, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_commentsARead-only
The comments the person left in TrailMark on passages of the project's Markdown documents ("this contradicts section 2", "simplify"). Each has an id, the document path, the quoted passage, its heading path and line, the comment text, when it was made, and state: anchored when the quote is still in the document (the line is where it is now), passageChanged when the passage was rewritten (the line is the best guess) or documentGone. Open comments by default; pass which = done or all for others. Call this when the person asks you to go through, address or apply their comments on the documents. A warning says when the comments file could not be read, which is why the list is empty. Also works when TrailMark is closed, from the project's files.
| Name | Required | Description | Default |
|---|---|---|---|
| which | No | Which comments: `open` (the default), `done` or `all`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnlyHint, and the description adds substantial context beyond them: the meaning of each `state` value (anchored/passageChanged/documentGone) and what the line number means in each case, the `warning` field explaining an empty list, and the fact it works with TrailMark closed.
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?
Dense but front-loaded with the resource and its fields, then state semantics, then usage trigger, then the warning caveat. Slightly list-like in enumerating output fields, but with no output schema that content 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?
With no output schema, the description fully documents the returned fields and the meaning of the state enum, plus failure behavior and offline operation. An agent has everything needed to call and interpret this tool correctly.
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% and the schema text for `which` ('open (the default), done or all') is essentially identical to the description's restatement. Baseline 3 is appropriate since the schema already carries the parameter semantics and the description adds no new syntax or format detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (comments the person left) with precise scope: passages of the project's Markdown documents, illustrated with example quotes. It is immediately distinguishable from siblings like list_notes, list_tags, and resolve_comment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear triggering condition ('Call this when the person asks you to go through, address or apply their comments') and explains the default filter plus how to change it via `which`. It does not explicitly name the alternative (resolve_comment) or state when not to use this tool, so 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_notesARead-only
The notes the person chose to share with agents in TrailMark (its Notes window keeps their quick notes, drafts and prompts, and nothing in it is visible to you unless they shared that note). Each has note (its name, which read_note takes), title (its first line), when it was last changed and its size, newest first. Call this when the person points at their notes ("my note about the deploy", "the prompt I wrote", "what I jotted down"). A note that is not shared is not listed and cannot be read; you cannot list the notes folder. Also works when TrailMark is closed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered; the description adds the sharing/permission model, newest-first ordering, the fact that the notes folder itself cannot be listed, and that it works when TrailMark is closed. It stops short of describing result limits or pagination, so it is not exhaustive.
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?
Front-loaded with the resource and the returned fields, then the trigger, then the constraints. The parenthetical explaining the Notes window is slightly digressive but still carries real information about scope and privacy.
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 carries the burden of return-value semantics and does so, naming the fields and ordering. It also covers the privacy boundary and offline behavior, so an agent has everything needed to call and interpret 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?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline is 4. The description's field notes (`note`, `title`, last-changed, size) describe the returned records rather than inputs.
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?
Uses a specific verb+resource (list the shared notes in TrailMark) and immediately differentiates from the sibling read_note by naming the `note` field read_note consumes. An agent can tell it apart from list_comments, list_tags, and list_unread without opening a 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?
Gives an explicit trigger with representative user utterances ("my note about the deploy", "the prompt I wrote", "what I jotted down") and states the negative case: a note that is not shared is not listed and cannot be read, routing the agent to read_note only for shared notes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tagsARead-only
The tags in use in the project's Markdown documents: each tag with how many documents have it (count) and where it is written (from: frontMatter in the documents, trailmark added by the person in TrailMark, or both), most used first (the first 50; more says how many were left out), plus documents (how many Markdown documents there are) and untagged (how many have no tag), so you can tell whether tags are worth using here. Pass tag to list the documents that have it instead: each with its path, its one-line description (left out when it has none) and all of its tags (the first 20; total and more count the rest). limit asks for more or fewer. Use it to find the right documents in two calls in a large project: call list_tags (or search with tags) to narrow down, then read only the few documents that fit, instead of going through many search hits. Also works when TrailMark is closed, from the project's files.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | A tag, as `list_tags` names it without this argument. With it, the answer lists the documents that have that tag (path, description and all of their tags) instead of the tags. Optional. | |
| limit | No | How many tags (or, with `tag`, documents) to list at most: 50 tags or 20 documents when left out, up to 200 tags or 100 documents. `more` in the answer says how many were left out. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint already declares this a safe read, but the description adds context the annotation does not: origins of tags (frontMatter vs trailmark vs both), default page sizes (first 50), truncation signaling (`more`), and operation when TrailMark is closed. It does not contradict the read-only annotation; the only gap is lack of explicit statement that no mutation occurs (already covered by annotations).
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?
Front-loaded with the core purpose, and each sentence carries information (fields, origins, defaults, workflow). It is dense and reads as an unbroken block rather than being split into scannable units, and the parenthetical detail borders on over-specification, but there is little genuine waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by documenting the return shape in detail (count, from, documents, untagged, more/total) plus the alternate mode's fields. For a 2-optional-param read-only tool this is fully sufficient to call it correctly.
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 baseline is 3, but the description adds real meaning: `tag` is not just a filter but switches the entire output shape from tags to documents, and `limit` interacts with two different default/cap regimes (50/200 tags vs 20/100 documents). That framing exceeds the schema's field-level description.
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 ('list_tags' returning tags in the project's Markdown documents) and enumerates the exact payload fields (count, from, documents, untagged, more). It also defines a second mode (passing `tag` lists documents instead), so an agent can distinguish behavior from siblings like search without opening a 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?
Explicitly prescribes a workflow ('find the right documents in two calls'), names the alternative ('or search with `tags`') and the condition that selects it, and notes a special case ('also works when TrailMark is closed'). When-to-use and alternatives are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_unreadARead-only
The Markdown documents that changed since the person last read them in TrailMark, newest change first, with the time of the change. Call this when the person asks what changed, what they have not read yet, or to catch up (for example after you or another agent edited documents). Also works when TrailMark is closed, from the project's files.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered; the description adds real value beyond that by disclosing ordering (newest change first), that each item carries the change time, and that it works even when TrailMark is closed by reading from the project's files. It does not describe volume, pagination, or per-person scoping.
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 sentences, front-loaded with what is returned before the when-to-use guidance. Every clause earns its place, with only minor redundancy in the parenthetical example.
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 parameters, no output schema, and readOnlyHint covering the safety profile, the description supplies enough for correct invocation: what it returns, ordering, timing, and the closed-app fallback. It could be more complete by noting the response shape or any limits, but nothing essential 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?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a parameterless tool is 4. The description correctly implies the scope is implicit (the current person's read state) rather than configurable.
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 resource and scope: 'The Markdown documents that changed since the person last read them in TrailMark,' which is clearly distinct from siblings like search, read_note, and list_notes. It is precise about what is returned and in what order, though it never explicitly names a sibling to differentiate from.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger conditions: 'when the person asks what changed, what they have not read yet, or to catch up,' plus a concrete example (after an agent edited documents). No when-not guidance or named alternative (e.g., search) is offered, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openA
Show the person a place in TrailMark: a document, optionally at a line or a heading. TrailMark opens it in its window without taking focus from your terminal, highlights the section and shows a notice with a way back; the person looks when ready. Use it after you wrote or found something they should see ("see the new section in docs/plan.md"). It starts TrailMark on the project if it is closed. It only shows; it never changes a document.
| Name | Required | Description | Default |
|---|---|---|---|
| line | No | A line of the document to show (from 1). Optional. | |
| path | Yes | The document, relative to the project folder, with `/` separators (for example `docs/plan.md`). | |
| heading | No | A heading of the document to show, such as `Rollout`, or a path of headings such as `Plan > Rollout`. Wins over `line` when the document has it. Optional. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond the annotations: it does not steal terminal focus, it highlights the section, shows a notice with a way back, and launches TrailMark if the project is closed. The stated 'never changes a document' guarantee is consistent with readOnlyHint=false, which reflects side effects on app state (window/app launch) rather than document mutation.
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?
Purpose is front-loaded in the first clause, and each sentence adds something (trigger, side effects, non-mutation guarantee). It is somewhat clause-heavy in the middle sentence, which slightly dilutes scanning, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With three parameters, no output schema, and minimal annotations, the description carries and covers the key behavior an agent needs. It omits edge cases such as what happens when the path or heading does not exist, which is the main residual gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so path, line, and heading are already fully documented, including the rule that heading wins over line. The description only restates 'optionally at a line or a heading' and adds no format, range, or fallback 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?
Specific verb plus resource ('Show the person a place in TrailMark: a document, optionally at a line or a heading') and a scope boundary ('It only shows; it never changes a document'). This clearly distinguishes it from the read/list siblings such as read_note, search, and list_notes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger: 'Use it after you wrote or found something they should see' with an example invocation phrase. It stops short of naming alternatives or exclusion cases (e.g. when to prefer read_note or search instead), so it falls just below the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_noteARead-only
Read one of the notes the person shared with agents, by the note name that list_notes gives. Returns its title and its whole text. It only reads: it cannot change a note, and a note that is not shared is said not to exist. Also works when TrailMark is closed.
| Name | Required | Description | Default |
|---|---|---|---|
| note | Yes | The note's name, exactly as `list_notes` gives it in `note` (for example `2026-10-15 1432.md`). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation the description discloses useful behavior: it cannot modify anything, non-shared notes are reported as non-existent (a deliberate hiding behavior an agent must expect), and it works even when TrailMark is closed. This goes well past the structured safety hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what is read and what comes back, then the two behavioral caveats. No filler and nothing repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a single documented parameter, no output schema, and a readOnly annotation, the description covers everything an agent needs: the return shape (title and whole text), the error semantics for unshared notes, and availability when the app is closed.
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% and the schema already explains the exact `note` name format with an example. The description's mention of the note name and its source in `list_notes` reinforces but does not add meaning beyond the schema, 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 (read) and resource (one shared note) and pins the input to the `note` name produced by `list_notes`. It explicitly distinguishes itself from the sibling `list_notes` by operating on a single note rather than the list, and it names the return payload (title + whole text).
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 tells the agent where the `note` argument comes from (`list_notes`), which is the key routing prerequisite. It does not state an explicit when-not or contrast against `search` or `get_context`, so it stops short of full alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_commentA
Mark one comment done after you addressed it, with an optional short reply saying what you did ("Rewritten in 3f2a1c"), which TrailMark shows under the comment. Use the id from list_comments. This is the only change an agent can make through TrailMark: it cannot write comments or edit documents. Also works when TrailMark is closed, on the project's files.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The comment's `id`, as `list_comments` gives it. | |
| reply | No | A short message to the person saying what you did, such as `Rewritten in 3f2a1c`. They read it under the comment. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as a non-destructive write, but the description adds real behavioral context beyond them: the optional reply is surfaced under the comment for the reader, and the tool works even when TrailMark is closed, operating directly on the project's files.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action and its trigger, with no filler. It is slightly dense because it folds the reply rendering, id source, and write-scope limit into one sentence, but 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?
No output schema exists, but the description covers what changes, where the id comes from, and the side effect on the reader, which is enough to invoke it correctly. It omits edge cases such as invalid or already-resolved ids, a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both `id` and `reply` are already documented in the schema, including the 'Rewritten in 3f2a1c' example. The description restates the same information without adding format or constraint details, 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?
The description states a precise verb+resource ('Mark one comment done') and scopes it with the condition 'after you addressed it'. It is immediately distinguishable from read-only siblings like list_comments and list_notes.
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 names the trigger ('after you addressed it'), the prerequisite for obtaining the argument ('Use the `id` from list_comments'), and an explicit boundary ('it cannot write comments or edit documents'), which routes the agent correctly among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchARead-only
Find where something is described in the project's Markdown documents. Returns the best matching sections ranked, each with its path, heading path, line and a short snippet (the same index as TrailMark's Search everywhere), and the tags and description of its document when it has them. Use it to locate documentation before reading whole files, for example to find the section that defines a term or a decision. In a large project, narrow first: pass tags (see list_tags) to look only in the documents that have all of them, then read just the few that fit. Leave query out when you pass tags to get those documents (path, description, tags) instead of sections. Also works when TrailMark is closed, from the project's files.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Look only in the documents that have all of these tags, as `list_tags` names them (for example `["adr"]`). Optional. | |
| limit | No | How many sections to return (1 to 25). Ten when left out. With `tags` and no `query` it is how many documents to list instead (up to 100, twenty when left out). | |
| query | No | What to look for: keywords or a short phrase, as you would type them into a search box. Leave it out when you pass `tags`, to get the documents that have those tags instead of sections. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint already declaring the safety profile, the description adds substantial behavior: the exact shape of each result (path, heading path, line, short snippet), the fact that document `tags`/`description` accompany results, the ranked/section-vs-document mode change based on whether `query` is supplied, and the notable fact that it 'also works when TrailMark is closed, from the project's files.'
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?
Front-loaded with purpose and return shape, then usage, then the large-project strategy — a sensible order with little waste. Slightly over-long, and the `query`/`tags` mode rule is restated in the schema, so one sentence is partly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description fully specifies the return payload (ranked sections with path, heading path, line, snippet, plus document tags/description) and the alternate return when `tags` is used without `query`. Nothing an agent needs in order to call and interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds genuine semantics beyond the schema by explaining the interaction between `query` and `tags` (omitting `query` converts the call from a section search into a document listing) and by recommending `tags` as the narrowing step in large projects.
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 — 'Find where something is described in the project's Markdown documents' — and immediately characterizes the return as ranked matching sections. It further distinguishes itself from siblings by framing the job as locating documentation 'before reading whole files,' positioning it against read_note/open.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('to locate documentation before reading whole files, for example to find the section that defines a term or a decision'), a concrete narrowing strategy for large projects, and names the sibling `list_tags` as the prerequisite for the tags path. It also states the mode switch: leave `query` out when passing `tags` to list documents instead of sections.
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.
9 tool updates
v0.1.0- First observed
get_context - First observed
list_comments - First observed
list_notes - First observed
list_tags - First observed
list_unread - First observed
open - First observed
read_note - First observed
resolve_comment - First observed
search
TDQS
Scored across 9 tools
Each tool targets a distinct resource or action: get_context (live screen state), list_unread (changed docs), search (locate sections), open (show the person), list_comments/resolve_comment (comment lifecycle), list_notes/read_note (note access). The cluster of read-only listing tools (list_comments, list_notes, list_tags, list_unread) shares a similar 'what does the person have' flavor and could momentarily be confused, but descriptions clearly separate them.
Most tools follow a predictable verb_noun pattern (get_context, list_comments, list_notes, list_tags, list_unread, read_note, resolve_comment), all snake_case. Two tools—open and search—are bare verbs without an object, which is a minor deviation but still natural and readable, especially as both are unambiguous.
Nine tools is well within the ideal 3-15 range and each earns its place, mapping the observable surface of a documentation project (context, comments, notes, tags, unread, search, display). No redundant or filler tools.
The surface covers the person's annotations and project awareness well: comments (list + resolve), notes (list + read), tags, unread tracking, search, and display. Notable gaps remain—there is no tool to return raw document content (search gives only snippets, open only displays), and no way to create comments or edit documents, though the latter is an explicit design constraint ('the only change an agent can make').
Maintenance
Related MCP Connectors
MCP Server for Slima - AI Writing IDE for Novel Authors with AI Beta Reader.
Read-only MCP server exposing a user ORANO library to their own AI agent.
Read-only MCP server: let AI agents read your ORANO saved-video library, tasks, and memory.
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
Related MCP Servers
- AlicenseCqualityDmaintenanceMCP protocol server for managing multi-project Markdown documents, supporting project isolation and LLM tool integration.2913 npm4MIT
- AlicenseAqualityBmaintenanceMCP server for markdown files — search, extract sections, list headings, find code blocks across docs.6287 npm8MIT
- FlicenseNot gradedqualityCmaintenanceMCP server that enables full-text search and link navigation over Markdown files as a knowledge graph.-
- AlicenseNot gradedqualityAmaintenanceMCP server that enables AI assistants to open files and highlight ranges in a read-only Markdown and code viewer.20 npmMIT