Skip to main content
Glama

Vortex Notes

End-to-end-encrypted notes that double as memory for your AI agents.

Your notes are plain .md files you own — greppable, git-able, Obsidian-compatible. Vortex Notes adds the two things a notes app and an agent-memory store each do separately, in one place:

  • The server can't read anything. A 12-word phrase is your whole account; keys are derived in your browser. The relay stores ciphertext only — no plaintext field exists in its schema, and there's no password to reset because there's nothing on the server to reset.

  • Agents are principals, not passengers. An agent gets its own key — born on its machine, never transmitted, certified by yours, scoped to the spaces you grant, and revocable in one command. Every edit it makes is signed as the agent.

That combination — agents can fully use it and the server can't read it — is the empty quadrant this fills.


The app

A real app, not a viewer: installable on iPhone / Android / Mac (works offline), sub-second cross-device sync over WebSocket, and an Obsidian-style live-preview markdown editor that's as good on a phone as on a desktop.

  • Password-locked notes — lock a note with a password or your 12 words; the title stays visible, the body is a sealed second layer even your own devices can't read until unlocked.

  • Version history & recovery — every synced version is kept; restore an earlier one, or recover a note whose password you lost from before it was locked.

  • Public notes — publish any note to a themed public page in one tap.

  • Change your 12 words — rotate your recovery phrase without losing a thing; every signed-in device and agent keeps working, the old phrase goes dead.

Related MCP server: Citadel

Agent memory (MCP)

A first-party MCP server gives Claude Code, OpenClaw, Cursor, or any MCP client task-shaped tools — not a CRUD mirror — and it works headless:

  • search_notes · read_note · write_note · edit_note (surgical)

  • append_daily — timestamped journal entries

  • remember(fact, supersedes) — facts with a lifecycle: a superseded fact stays visible, struck through, pointing at what replaced it. Auditable, not a black box.

  • build_context(topic) — the top notes in full plus one hop of [[wikilinks]], so an agent starts a task with the right context in one call.

Search is on-device. Hybrid BM25 + multilingual embeddings (SQLite FTS5 + sqlite-vec + a small local model). No API key, nothing leaves your machine, and an English query finds your Spanish notes across ~100 languages.


Quick start

Try the app

Open vortex-notes.pages.dev/app, create an account (save the 12 words), and start writing. Add it to your home screen to install it. That's the whole onboarding — no email, no password.

Connect an agent

On the agent's machine:

npx -y vortex-notes@latest pair

It prints a 6-letter code; approve it in the app (user menu → Agents & devices → Pair an agent). The agent gets its own scoped, revocable key and never sees your recovery phrase. pair then wires every harness it finds on that machine, pinned to the paired vault:

  • Claude Code: user scope, so every project sees it

  • Hermes: type /reload-mcp afterwards

  • OpenCode: added to ~/.config/opencode/opencode.json

No MCP in your agent? The same tools work as shell commands, see Agents without MCP. Works over SSH too (you approve from your phone). Any other stdio MCP client: { "command": "npx", "args": ["-y", "vortex-notes", "mcp"], "env": { "VORTEX_NOTES_VAULT": "<path pair printed>" } }. Add --read-only to make it read-only.

Connect Claude.ai, ChatGPT, or another chat app

Chat apps in the browser or on your phone can only reach an MCP server by URL. In the app: user menu → Agents & devices → Connect a chat app creates a cloud agent and gives you a secret connector URL:

  • Claude (web, desktop, mobile): Settings → Connectors → Add custom connector → paste the URL

  • ChatGPT: Settings → Apps & Connectors → Advanced → Developer mode → Create → paste the URL (no authentication)

This is the one opt-in exception to zero-knowledge: the relay holds that agent's key (encrypted at rest) so it can serve the notes that agent may access. It's scoped, can be read-only, and revoking it kills the URL. Everything else stays end-to-end encrypted.

Use the CLI

npm install -g vortex-notes
vortex-notes init                              # create a vault
vortex-notes search "that idea about pricing"  # hybrid semantic + keyword
vortex-notes serve                             # local web viewer at 127.0.0.1:7303

Agents without MCP: the same tools as commands

Every MCP tool is also a command, so any agent that can run a shell (OpenClaw-style harnesses, scripts, cron, git hooks) gets the same behavior. After pair, commands find the paired vault by themselves; each one syncs before reading and after writing.

npm install -g vortex-notes@latest                # once, so `vortex-notes` is on PATH
vortex-notes context "kiln"                       # top notes in full + linked notes
vortex-notes read projects/kiln.md
vortex-notes daily "fired the test tiles"
vortex-notes remember "Kiln max is cone 8" --topic kiln --supersedes "cone 10"
vortex-notes write "Glaze tests" "Three recipes…" --folder studio --tags glaze
vortex-notes edit clay.md --append "Order more in May."
vortex-notes recent --days 3 --json               # --json on any command

write/edit/daily/remember read stdin when the text is -. Errors exit 1 ({"error": …} with --json). Full list: vortex-notes --help. There's a ready OpenClaw skill built on these.

The index in .vortex/index.db is disposable — the markdown files are always the source of truth. VORTEX_NOTES_NO_SEMANTIC=1 skips embeddings (keyword only, no model download).

Self-host the relay

The hosted relay at vortex-notes.pages.dev is convenience, not lock-in. Run your own:

vortex-notes relay --port 7300 --db ~/relay.db   # the ciphertext store, web app and chat connectors
vortex-notes setup --relay http://<host>:7300    # on each computer: your 12 words, then sync
npx -y vortex-notes@latest pair --relay http://<host>:7300   # an agent machine

Open http://<host>:7300/app to create an account in the browser.

  • Your data is the --db file (default ~/.vortex-notes/relay.db). Back it up. --db :memory: is for throwaway tests.

  • Chat apps (Claude, ChatGPT):

    • Set RELAY_CONNECTOR_KEK to 64 hex characters (openssl rand -hex 32) before creating connectors, so their keys are encrypted at rest.

    • Serve the relay over HTTPS (Caddy, nginx, or a tunnel): the chat apps can't reach localhost.

    • OAuth discovery follows the Host / X-Forwarded-Host headers, so a reverse proxy just works.

  • Other settings:

    • RELAY_QUOTA_MB caps each account's storage.

    • RELAY_ADMIN_ACCOUNT (your Account ID) turns on admin stats in the web app.

  • Native apps: the Mac and iPhone apps use the hosted relay for now. The CLI, agents and the web app work with any relay.

How the encryption works

A 12-word BIP39 phrase derives your account's signing + encryption keys. Each device and agent has its own random keypair, certified by your account key — an account → device → agent chain. A space's content key is sealed to each principal that may read it; the relay enforces scope and read-only on every signed request but only ever holds sealed blobs.

What a malicious or subpoenaed relay can do: serve stale or withheld ciphertext (detectable via sequence gaps). What it can't do: read a note, a title, or a key; forge an edit; or silently alter one. The WebSocket sync channel carries only content-free "a space changed" pokes — the doorbell, never the data.

For a broad usage view, the relay derives a coarse country (two-letter code) from your IP in memory and stores only that code — the IP itself is never written to disk or logged.

Stack

TypeScript, all-MIT: @noble / @scure crypto, CodeMirror 6, better-sqlite3, sqlite-vec, transformers.js, marked. The relay is a small Node service; the web app is a single esbuild bundle with all crypto client-side. 48 unit tests plus ten Playwright browser suites.

MIT © Vortex303

Available Tools

9 tools
append_dailyAppend to daily noteA

Append a timestamped entry to today's daily note (or a given date). The right place for observations, decisions, and things to remember.

NameRequiredDescriptionDefault
dateNoYYYY-MM-DD (default: today)
contentYesMarkdown for the entry (one bullet)

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses that this is an append operation creating a timestamped entry (implying non-destructive addition), but it does not explain whether a missing daily note is created, whether the operation is idempotent, what permissions are required, or what the response looks like.

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

Conciseness5/5

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

Two tightly written sentences with zero waste. The key scoping information (today's daily note or a given date) is front-loaded, and the usage context follows efficiently.

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

Completeness4/5

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

For a simple two-parameter tool with no output schema and no annotations, the description covers purpose, usage context, default date behavior, and entry format. The main gap is not stating whether the note is created if absent, which is a meaningful behavioral detail for an append tool.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented with types and defaults. The description restates the date parameter's default and adds that entries are timestamped and one bullet, but does not add substantial meaning beyond what the schema provides. Baseline 3 is appropriate.

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

Purpose4/5

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

The description states a specific verb ('Append') and resource ('today's daily note'), with scope for a given date. It is clear enough to distinguish from general note tools like write_note and edit_note by virtue of targeting the daily note, though it does not explicitly name those siblings.

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

Usage Guidelines4/5

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

It gives clear context for when to use the tool: 'The right place for observations, decisions, and things to remember.' It does not name alternatives or exclusions (e.g., when to use remember or write_note instead), so it falls 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.

build_contextBuild contextA
Read-only

Load working context for a topic in one call: full content of the top-matching notes plus one hop of [[wikilinked]] notes as pointers. Prefer this over multiple search+read rounds when starting work on a topic.

NameRequiredDescriptionDefault
topicYesTopic, question, or entity to build context for
max_notesNoPrimary notes to include in full (default 4)

TDQS

A4.2/5.0
Behavior4/5

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

The readOnlyHint already covers the safety profile, and the description adds genuinely useful behavior: matching notes are returned in full while neighbors are only pointers, which sets expectations about cost and result shape. It does not mention any limits or pagination on the hop expansion, keeping it from 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.

Conciseness5/5

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

Two sentences, zero waste, with the payoff (full content plus neighbor pointers) front-loaded before the routing advice. Nothing is repeated from the title.

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

Completeness4/5

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

With no output schema, the description carries the return-shape burden and does reasonably well by distinguishing full content from pointers. The exact form of a "pointer" is left implicit, a small gap for what is essentially a read-aggregation tool.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented, including max_notes' default and 1-10 bounds. The description adds no parameter-specific meaning beyond what the schema provides, which is the expected baseline.

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

Purpose5/5

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

States a specific verb (load/build) and resource (working context for a topic) and describes exactly what comes back: full content of top-matching notes plus one hop of wikilinked notes as pointers. An agent can tell this apart from search_notes and read_note without opening their schemas.

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

Usage Guidelines4/5

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

"Prefer this over multiple search+read rounds when starting work on a topic" gives a clear triggering condition and implicitly names the alternatives it replaces. It stops short of an explicit exclusion (e.g. a single known note should use read_note), so it is strong rather than exhaustive.

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

edit_noteEdit noteA
Destructive

Edit an existing note surgically: append, prepend, or find_replace (exact string). Prefer this over rewriting whole notes.

NameRequiredDescriptionDefault
findNoExact string to find (find_replace only)
pathYesVault-relative path
contentYesText to append/prepend, or replacement text for find_replace
operationYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, so the safety profile is carried. The description adds that edits are surgical and find_replace is an exact-string match, which helps. It does not disclose what happens when the find string is missing or non-unique, nor that changes are unrecoverable, which is significant for a mutation tool.

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

Conciseness5/5

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

Two compact sentences with the operation modes front-loaded and the sibling preference trailing. No filler or redundancy.

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

Completeness3/5

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

There is no output schema, and the description never says what a successful or failed edit returns, nor how a failed find_replace is reported. For a destructive four-parameter mutation tool this leaves real gaps, though the core calling semantics are covered.

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

Parameters3/5

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

Schema coverage is 75%, so most parameter meaning is already documented, including that find is exact-string and find_replace-only. The description reinforces the three operation values but adds no format or constraint details beyond what the schema and enum already convey. Baseline 3 applies.

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

Purpose5/5

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

States a specific verb (edit) and resource (existing note) plus the three supported modes: append, prepend, find_replace. It also distinguishes itself from the sibling write_note by saying to prefer it over rewriting whole notes, so an agent can differentiate without opening schemas.

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

Usage Guidelines4/5

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

"Prefer this over rewriting whole notes" gives a clear selection rule against the obvious alternative, and "surgically" sets the intent. It lacks explicit when-not guidance or mention of read_note/search_notes as prerequisites for locating a find target.

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

list_notesList notesB
Read-only

List note paths, optionally under a folder.

NameRequiredDescriptionDefault
limitNo
folderNoVault-relative folder to list (default: whole vault)

TDQS

B3.1/5.0
Behavior3/5

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

readOnlyHint=true already declares the safety profile, so the bar is lower. The description does add real information beyond the annotations by stating the return is 'note paths' (not note content) and that the default scope is the whole vault, but it says nothing about ordering, limits, or whether folder listing is recursive.

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

Conciseness5/5

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

A single sentence with zero filler, front-loaded with the verb and resource. Nothing to trim.

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

Completeness3/5

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

For a read-only listing tool with no output schema, the description covers the basic shape (paths, optional folder) but leaves open whether results are paginated, how the limit default behaves, and how ordering works. Adequate but with clear gaps for a tool that can return many entries.

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

Parameters2/5

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

Coverage is 50%: the folder parameter is documented in the schema, and the description merely restates it ('optionally under a folder'). The limit parameter is never mentioned in the description, so nothing compensates for the half of the schema that lacks semantic detail.

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

Purpose4/5

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

Specific verb 'List' with the resource narrowed to 'note paths', plus a scoping qualifier ('optionally under a folder'). An agent can tell this is a path-enumeration tool rather than a content search, though it never names search_notes as the contrasting sibling.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no mention of when to prefer search_notes or read_note instead, and no prerequisites. The only conditional ('optionally under a folder') describes a parameter, not a usage decision.

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

read_noteRead noteA
Read-only

Read a note's full markdown content by vault-relative path.

NameRequiredDescriptionDefault
pathYesVault-relative path, e.g. 'projects/idea.md'

TDQS

A3.6/5.0
Behavior3/5

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

readOnlyHint=true already tells the agent this is a safe read. The description adds that the entire raw markdown body is returned (not metadata or an excerpt), which is useful, but says nothing about error behavior for missing paths or truncation of very 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.

Conciseness5/5

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

One sentence, front-loaded with the verb and resource, with the key qualifier (vault-relative path) at the end. Nothing is redundant or padded.

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

Completeness4/5

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

For a single-parameter read tool with full schema coverage and a readOnlyHint, the description covers what is returned at a high level. Since no output schema exists, it could say slightly more about the response shape, but nothing critical is missing.

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

Parameters3/5

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

There is a single parameter with 100% schema description coverage ('Vault-relative path, e.g. projects/idea.md'), so the schema already carries the semantics. The description echoes the vault-relative framing without adding new meaning, which is the baseline 3.

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

Purpose4/5

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

States a specific verb (read) and resource (a note) plus the return scope ('full markdown content') and the path convention ('vault-relative'). It is clear against list_notes/search_notes in effect, but it never names a sibling explicitly, so a 4 rather than a 5.

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

Usage Guidelines3/5

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

Usage is only implied: the tool requires a known path, which implicitly contrasts with search_notes/list_notes for discovery. There is no explicit when-to-use, when-not, or named alternative, so it stays at the minimum-viable level.

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

recent_activityRecent activityB
Read-only

List notes modified in the last N days, newest first.

NameRequiredDescriptionDefault
daysNoLookback window (default 7)
limitNo

TDQS

B3.3/5.0
Behavior3/5

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

readOnlyHint already declares this is a safe read, and the description usefully adds the sort order ('newest first'), which annotations do not cover. It says nothing about truncation behavior at the limit cap, what a 'modified' timestamp means, or what the results contain, so behavioral disclosure is only partial.

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

Conciseness5/5

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

A single tight sentence with the scope and ordering front-loaded and no padding. Nothing could be removed without losing information.

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

Completeness3/5

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

For a simple two-parameter read tool with annotations covering safety, this is close to sufficient. The remaining gaps are the undocumented 'limit' semantics and the absence of any statement about what each returned item includes, which matters more here because there is no output schema.

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

Parameters2/5

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

Schema coverage is only 50%: 'days' is documented with a default in the schema, but 'limit' has no description anywhere. The phrase 'last N days' merely restates the 'days' parameter without adding format, default, or edge-case meaning, and the description does nothing to compensate for the undocumented 'limit'.

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

Purpose4/5

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

States a specific verb and resource plus a scope (notes modified in the last N days) and an ordering (newest first). An agent can tell this apart from list_notes or search_notes on scope grounds, though no sibling is named explicitly.

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

Usage Guidelines3/5

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

The recency framing implies when this tool is appropriate (recent-changes style queries) versus a full listing or a search. However, no explicit when-to-use/when-not or comparison to search_notes, list_notes, or read_note is given, leaving routing to inference.

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

rememberRemember a factA

Record a durable fact in the shared memory (memory/*.md) as a dated bullet with a stable ^id. If it replaces an earlier fact, pass supersedes (the old fact's ^id, or a distinctive substring of it) — the old fact stays visible with strikethrough and a pointer to the new one. Use search_notes to find existing facts first.

NameRequiredDescriptionDefault
factYesThe fact, stated so it makes sense without conversation context
topicNoOptional topic — facts go to memory/<topic>.md instead of memory/facts.md
supersedesNo^id or distinctive substring of the fact this replaces

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden and does well: it explains persistence, dated bullet formatting, stable ^id behavior, and the non-destructive supersede semantics where the old fact remains visible with strikethrough and a pointer. It omits permissions, failure modes, and return behavior, which keeps it below 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.

Conciseness5/5

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

The description is three tightly written sentences, front-loaded with the core action and followed by the key edge case and prerequisite. Every sentence adds useful information without repetition.

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

Completeness4/5

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

For a 3-parameter tool with 100% schema coverage and no annotations, the description covers the main invocation behavior, supersede semantics, and search-first workflow. It is nearly complete, though it does not describe what the tool returns or any permission constraints.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds meaningful semantics beyond the schema for supersedes: the old fact remains visible with strikethrough and a pointer. It also reinforces the durable-fact and memory-path behavior for fact and topic.

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

Purpose5/5

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

The description states a specific verb and resource: it records a durable fact in shared memory (memory/*.md) as a dated bullet with a stable ^id. That is concrete enough for an agent to distinguish it from generic note-writing siblings such as write_note or edit_note.

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

Usage Guidelines4/5

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

It gives a clear usage instruction to search_notes first for existing facts, and it explains when to use the supersedes parameter. It does not explicitly say when to prefer write_note or edit_note instead, so it falls short of full alternative routing.

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

search_notesSearch notesA
Read-only

Search the vault with hybrid keyword + semantic search. Returns note paths, headings, and snippets. Use read_note for full content.

NameRequiredDescriptionDefault
modeNoSearch mode (default hybrid)
limitNoMax results (default 8)
queryYesNatural-language or keyword query

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds genuine behavioral content beyond that: the hybrid keyword+semantic retrieval model and the shape of results (paths, headings, snippets), which tells the agent it gets excerpts, not full documents. Ranking, pagination, and result-ordering behavior are not described.

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

Conciseness5/5

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

Three short sentences, front-loaded with what the tool does, then what it returns, then the follow-up routing. Every sentence carries distinct information with zero repetition of the schema.

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

Completeness4/5

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

For a read-only search tool with a fully documented schema and no output schema, the description covers purpose, retrieval mechanism, and return shape, which is sufficient to call it correctly. It leaves out ranking/ordering behavior and whether results are truncated by the limit, minor gaps for this complexity level.

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

Parameters3/5

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

Schema coverage is 100%, with each of query, mode, and limit documented in the schema including the enum and defaults. The description's mention of hybrid keyword+semantic implicitly signals the mode values but adds no syntax, formatting, or query-construction guidance 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.

Purpose5/5

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

States a specific verb and resource (search the vault) plus the mechanism (hybrid keyword + semantic search), and explicitly distinguishes itself from read_note by scoping itself to discovery and routing full-content reads elsewhere.

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

Usage Guidelines4/5

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

The line 'Use read_note for full content' gives a clear alternative for the follow-up step, implying this tool is for locating notes. It does not address when to prefer search_notes over list_notes, recent_activity, or build_context, so sibling routing is only partially covered.

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

write_noteCreate noteA

Create a new markdown note. Fails if the path already exists — use edit_note to modify existing notes.

NameRequiredDescriptionDefault
tagsNo
titleYesNote title
folderNoOptional vault-relative folder, e.g. 'projects'
contentYesMarkdown body

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations present, the description carries the full burden, and it does disclose one important behavior: the tool fails rather than overwrites when the path already exists. It says nothing about required permissions, what the created note returns, or how tags are persisted, leaving meaningful behavioral gaps for a mutation tool.

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

Conciseness5/5

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

Two short sentences, each doing distinct work: the first states the action, the second states the failure mode plus the redirect. Nothing is redundant and the key constraint follows immediately after the action.

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

Completeness3/5

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

For a simple four-parameter mutation tool with no output schema and no annotations, the description covers the failure case but omits what a successful call produces and how tags/folder interact with the created path. It is minimally sufficient to call correctly but not fully self-contained.

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

Parameters3/5

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

Schema description coverage is 75%, so most parameters are documented structurally (title, content, folder), and the description adds little beyond restating that the body is markdown. The 'tags' parameter has no description in either place, so the description doesn't compensate for the remaining gap.

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

Purpose5/5

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

The description gives a specific verb and resource ('Create a new markdown note') and explicitly distinguishes itself from the sibling edit_note by noting that creation fails on an existing path. An agent can separate write_note from edit_note or append_daily 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.

Usage Guidelines4/5

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

It states a concrete condition ('Fails if the path already exists') and names the correct alternative ('use edit_note to modify existing notes'), which is explicit routing guidance. It stops short of covering the other siblings, such as when to prefer append_daily or remember, so it isn't fully exhaustive.

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

Tool Schema Changelog

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

  1. 9 tool updatesv0.1.0
    • First observedappend_daily
    • First observedbuild_context
    • First observededit_note
    • First observedlist_notes
    • First observedread_note
    • First observedrecent_activity
    • First observedremember
    • First observedsearch_notes
    • First observedwrite_note

TDQS

A3.6/5.0

Scored across 9 tools

Disambiguation4/5

Each tool has a fairly distinct purpose, and descriptions explicitly steer between near-neighbors (write_note vs edit_note, search_notes vs build_context). The main soft overlap is the family of write paths — write_note, edit_note, append_daily, and remember all add content to different targets — but the docs make the targets clear enough that misselection is unlikely.

Naming Consistency4/5

Most tools follow a clean verb_noun pattern (search_notes, read_note, write_note, edit_note, build_context, list_notes). Two outliers — the bare verb 'remember' and the adjective-style 'recent_activity' — break the pattern but remain readable and unambiguous.

Tool Count5/5

Nine tools is well-scoped for a note vault server, covering discovery, reading, writing, memory, and recency without redundancy. Every tool maps to a genuine workflow step; nothing feels padded or missing at the count level.

Completeness3/5

The surface covers search, read, create, surgical edit, daily append, durable memory, and recency, which handles most agent workflows. However there is no delete, move, or rename operation, so note lifecycle management is a dead end once a note is created at the wrong path or needs removal.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Local-first, file-based memory layer for AI agents — one shared Markdown vault across Claude, Codex, Gemini, Cursor and any MCP client. Provides read/write memory tools with an audit trail, per-agent trust levels, and Git sync; no cloud and no lock-in.
    2
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Portable AI memory that roams with you across models and harnesses — one shared memory for Claude Code, Codex, Cursor, Gemini CLI and more, stored as plain markdown files you own. Per-project spaces plus a shared layer, vault-wide search; runs locally over stdio/HTTP or hosted with OAuth 2.1 backed by your own GitHub repo.
    33 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents to capture, structure, remember, and retrieve source-backed memory as local Markdown files, with reviewable writes and no cloud dependency.
    219
    MIT