NOATNotion-style notes that live in your IDE. Local-first, git-versioned, searchable, and readable/writable by your AI agents over MCP. Stop taking notes in stray FeaturesA real editor, not a text fileNotes open as normal editor tabs with a Notion-style block editor: type Link to code with
|
| Tool | What it does |
|---|---|
list_notes |
List all notes, filterable by scope |
read_note |
Read a note as markdown (raw blocks optional) |
get_note_outline |
Cheap preview of a large note |
search_notes |
Keyword / semantic / hybrid search |
create_note |
Create a note from markdown |
append_to_note |
Append markdown to an existing note |
replace_note_content |
Rewrite a note's content |
get_current_repo_scope |
Map a working directory to its note scope |
Agents write plain markdown; NOAT converts it to real editor blocks. In Cursor the server registers itself automatically — no configuration.
Git-versioned, synced to your commits
~/.noat is its own git repository. Note edits save to disk immediately, and whenever you commit in any workspace repo, NOAT snapshots your pending note changes with a message linking the two histories:
sync(my-repo): 3942d13 Fix webhook ordering [2026-07-07 16:35]
No hooks are installed in your repositories — NOAT watches for commits through the editor's git integration.
Install
From source (marketplace release coming):
git clone https://github.com/pintchom/noat && cd noat
npm install
npm run install-local # builds, packages, and installs into Cursor
Reload your editor window. You'll find the NOAT book icon in the activity bar.
Note: the packaged extension currently bundles native binaries for the platform you build on (e.g. Apple Silicon). Per-platform marketplace builds are on the roadmap.
Quick start
- Click the NOAT icon in the activity bar → New Note (scoped to your repo or global).
- Write. Type
/for blocks,@to link a file. It auto-saves. Cmd+Shift+Sto search everything.- Commit code like you always do — your notes snapshot themselves alongside.
- Ask your agent things like "search my notes for the ledger migration plan" or "save what we just learned to a note in this repo's scope."
Keybindings & commands
| Binding | Action |
|---|---|
Cmd+Shift+S (Ctrl+Shift+S) |
Search notes (hybrid) |
Cmd+Alt+P (Ctrl+Alt+P) |
Search notes (alternate binding) |
Cmd+P while the NOAT sidebar is focused |
Search notes |
Cmd+Shift+S (Ctrl+Shift+S) inside a note |
Format selection as inline code (Slack-style) |
Cmd+Shift+Alt+S (Ctrl+Shift+Alt+S) inside a note |
Turn the selected blocks into a code block |
Use the keyboard icon in the NOAT sidebar or run NOAT: Edit Keyboard Shortcuts to open the native Keyboard Shortcuts editor filtered to NOAT commands. Changes are saved in your editor's user keybindings and work with Settings Sync.
Command palette: NOAT: New Note, NOAT: New Folder, NOAT: Search Notes, NOAT: Export Note as PDF, NOAT: Edit Keyboard Shortcuts, NOAT: Rebuild Search Index, NOAT: Open Notes Store in Terminal, NOAT: Refresh Notes, NOAT: Show All Repositories, NOAT: Show Current Repository Only.
MCP setup outside Cursor
Cursor registers the MCP server automatically. For other MCP clients, the extension keeps a copy of the server at a stable path inside the store and refreshes it on every update:
{
"mcpServers": {
"noat": {
"command": "node",
"args": ["/Users/you/.noat/mcp/dist/mcp-server.js"]
}
}
}
With Claude Code:
claude mcp add noat --scope user -- node ~/.noat/mcp/dist/mcp-server.js
The server works standalone — it reads ~/.noat directly and doesn't need the editor running. Set NOAT_HOME to use a different store location.
Enable NOAT: MCP Use Direct Json in your editor's settings to let agents read and write BlockNote JSON (preserving colors and rich formatting) instead of markdown. The extension persists this to config.json in the store, so the MCP server honors it in any host — Cursor, VS Code, or another MCP client. For setups where the extension isn't running, set NOAT_MCP_DIRECT_JSON=1 in the server's environment to override.
Storage
Everything lives in ~/.noat (override with NOAT_HOME):
~/.noat/
.git/ # your notes' own git history
.cache/ # embedding model cache (gitignored)
.index/ # search indexes — derived, rebuildable (gitignored)
mcp/ # stable copy of the MCP server (gitignored)
notes/
global/ # universal notes, nested folders allowed
repos/<repo-key>/ # notes scoped to one repository
Notes are .noat.json files: a small envelope (id, title, timestamps) around a BlockNote block array. Plain files — grep them, script against them, take them with you.
Architecture
┌─────────────────────────────┐
│ Cursor / VS Code │
│ ┌──────────┐ ┌───────────┐ │ ┌──────────────┐
│ │ Webview │ │ Extension │ │ │ MCP server │◄── agents
│ │ editor │◄┤ host │ │ │ (stdio) │
│ └──────────┘ └─────┬─────┘ │ └──────┬───────┘
└─────────────────────┼───────┘ │
▼ ▼
┌─────────────────────────────┐
│ ~/.noat (git repository) │
└─────────────────────────────┘
- Extension host — sidebar tree, commands, git sync, search engine, file-open actions
- Webview — React + BlockNote custom editor for
*.noat.json - MCP server — standalone stdio binary sharing the same core code and store
- Core (
src/core/) — note model, store I/O, repo scoping, search; no VS Code dependency
Development
npm install
npm run watch # rebuild on change; F5 to launch a dev host
npm test # core unit tests
npm run typecheck # all three targets
npm run lint
npm run seed # fill your store with rich demo notes + backdated history
See CONTRIBUTING.md for project layout and conventions.
Roadmap
- Note history viewer (versions live in git already; UI pending)
- Line-number file links (
file.ts:42) - Title edits renaming the underlying file
- Per-platform marketplace builds (OpenVSX + VS Code Marketplace)
License
MIT