Notepatra Notepatra MCP · new in v0.1.118

Your editor, readable by your AI

From v0.1.118, Notepatra ships notepatra-mcp — a Model Context Protocol server that lets Claude Desktop, Claude Code, OpenAI Codex, the OpenAI Agents SDK, and any spec-compliant MCP client see what you have open, search your workspace, run read-only SQL over your data files, read your Git status and Noter notes, and — only with your explicit per-action approval — edit, save, and create notes. Everything runs over stdio and a local socket. Nothing leaves your machine.

Release status. MCP first shipped in v0.1.118; the current release is v0.1.119, which expands the server to 35 tools (Git, read-only SQL, Noter write verbs, diagram export) and adds Windows named-pipe support. Everything on this page describes v0.1.119.

What it is

MCP (the Model Context Protocol) is the open standard AI assistants use to talk to tools. Notepatra's implementation is a small standalone binary, notepatra-mcp, that sits between your AI client and the running editor:

AI client (Claude Desktop, Claude Code, Codex, ...)
        │  stdio · JSON-RPC 2.0 (MCP)
        ▼
  notepatra-mcp  ──local socket──▶  Notepatra (the running editor)

In practice: ask your assistant "what do I have open?", "find where the config is parsed", "diff these two tabs", "format this JSON and put it in a new tab" — and it drives the actual editor on your screen.

The tool surface — 35 tools, three tiers

notepatra-mcp exposes 35 tools, grouped in three tiers by what they can touch. Read tools observe. Act tools drive visible, non-destructive editor actions. Write tools change buffer contents or disk — and every one of those is gated behind a human approval card.

Tier 1 — Read (18 tools, no approval needed)

ToolWhat it does
list_open_tabsList the open tabs with index, title, file path, and modified state.
read_tabRead the full text of one open tab, selected by index or by title.
get_selectionGet the currently selected text, with the tab it belongs to.
get_statusEditor state: active tab, file path, language, encoding, cursor position.
app_infoApplication info: name, version, edition (Lite/Full), platform.
list_recent_filesList recently opened file paths.
find_in_tabFind text inside one open tab (default: the active tab) — a literal substring, or a regular expression with {regex: true}.
search_projectSearch all open tabs plus files under the workspace folder, case-insensitive (capped at 200 matches) — a literal substring, or a regular expression with {regex: true}.
list_notesList Noter notes with title, file name, and last-modified time.
read_noteRead one Noter note by its file path.
list_remindersList your Noter reminders with note title, due time, and bucket (overdue / today / upcoming).
git_statusRead-only git status for the workspace repository.
git_diffRead-only git diff, optionally scoped to one path.
git_logRead-only git log (recent commits; default 20, capped at 100).
git_showRead-only git show for a commit or ref.
git_branchRead-only list of branches in the workspace repository.
validate_npdValidate a Notepatra diagram (.npd) — a tab or supplied source; returns parse errors with line numbers.
run_sqlRun a read-only SELECT over a CSV / Parquet / JSON file (or the active tab) and return columns + rows. SELECT-only and sandboxed — see the note below.
How run_sql stays safe. Every query is checked by the SQL classifier and rejected unless it is a pure SELECT — no INSERT, UPDATE, ATTACH, COPY, or DDL ever runs. On the Full (DuckDB) edition there is a second wall: the target CSV / Parquet / JSON is first materialized into an in-memory table, then DuckDB's external filesystem access is turned off (SET enable_external_access=false) before the untrusted SQL executes — so the query cannot reach host files even through read_text, read_csv_auto, glob, or a replacement scan. The csv_path argument is confined to your open workspace. Results are row- and cell-capped so a single answer can't exfiltrate a whole file.

Tier 2 — Act (9 tools, visible and non-destructive)

ToolWhat it does
open_fileOpen a file in a new tab, or focus the tab that already has it.
new_tabCreate a new untitled tab, optionally pre-filled with text.
goto_lineMove the cursor to a line in a tab — for pointing you at a location.
set_languageSet a tab's syntax-highlighting language.
compare_tabsOpen Notepatra's side-by-side Compare view for two open tabs.
format_jsonFormat JSON text and return the result (fails on invalid JSON).
format_sqlFormat SQL text and return the result.
format_htmlFormat HTML text and return the result.
open_noteOpen one Noter note in the editor by its file path.

Tier 3 — Write, with approval (8 tools, human-gated)

ToolWhat it does
insert_textInsert text into an open tab at the cursor, or at an explicit line/column.
replace_selectionReplace the currently selected text with new text.
apply_editLiteral find-and-replace in one open tab — first occurrence, or all of them.
save_tabSave an open tab to its file on disk.
create_noteCreate a new Noter note with a title and body.
append_noteAppend text to an existing Noter note.
set_reminderSet a due-time reminder on a Noter note.
export_diagramExport a diagram tab to a PNG or PDF file on disk.

The write-approval model

The eight write tools never execute on arrival. Each incoming write request shows a non-modal approval card inside the Notepatra window — it does not steal focus or block your typing — describing what the assistant wants to do, with a preview of the text involved and two buttons: Approve and Deny.

The gate lives in the editor process itself (the C++ bridge), not in the MCP sidecar — so a modified or malicious MCP client still cannot write without a human clicking Approve inside Notepatra. Read and act tools don't prompt: they can't change buffer contents or touch disk.

Setup — pick your client

The server binary is notepatra-mcp. All snippets below pass --socket, which connects it to the running editor; make sure notepatra-mcp is on your PATH (or use its absolute path), and have Notepatra running when the assistant calls a tool.

Get notepatra-mcp

From v0.1.118, every GitHub release ships prebuilt notepatra-mcp binaries — cosign-signed like every other release artifact:

Extract, chmod +x notepatra-mcp, and put it somewhere on your PATH:

tar xzf notepatra-mcp-linux-x64.tar.gz
chmod +x notepatra-mcp
sudo mv notepatra-mcp /usr/local/bin/

Or build it from source — the sidecar lives in notepatra-mcp/ in the repo and needs only stable Rust, no other dependencies:

cd notepatra-mcp
cargo build --release   # binary at target/release/notepatra-mcp

Windows is supported from v0.1.119: the sidecar connects to the running editor over a named pipe (\\.\pipe\…), so --socket works there too. Prebuilt Windows binaries aren't in the signed release bundle yet, so on Windows install it with cargo install notepatra-mcp or build from source (above).

ClientVendor ecosystemHow it connectsWorks with Notepatra?
Claude DesktopAnthropicstdio, via claude_desktop_config.jsonYes
Claude CodeAnthropicstdio, via claude mcp addYes
Codex CLIOpenAIstdio, via config.tomlYes
OpenAI Agents SDKOpenAIstdio, via MCPServerStdioYes
Cursor, Windsurf, VS Code, othersVariousstdio, via each client's MCP configYes — any spec-compliant stdio MCP client
ChatGPT connectorsOpenAIRemote URL onlyNo — cannot reach a desktop editor (see limitations)
claude.ai web connectorsAnthropicRemote URL onlyNo — cannot reach a desktop editor (see limitations)

Claude Desktop

Add Notepatra to claude_desktop_config.json (Settings → Developer → Edit Config):

{
  "mcpServers": {
    "notepatra": {
      "command": "notepatra-mcp",
      "args": ["--socket"]
    }
  }
}

Restart Claude Desktop; the Notepatra tools appear in the tools menu.

Claude Code

One command:

claude mcp add notepatra -- notepatra-mcp --socket

Then /mcp inside Claude Code shows the server and its 35 tools.

OpenAI Codex CLI

Add a block to ~/.codex/config.toml:

[mcp_servers.notepatra]
command = "notepatra-mcp"
args = ["--socket"]

OpenAI Agents SDK

Use the SDK's stdio server class (Python shown):

from agents import Agent, Runner
from agents.mcp import MCPServerStdio

async with MCPServerStdio(
    params={"command": "notepatra-mcp", "args": ["--socket"]},
) as notepatra:
    agent = Agent(
        name="Editor assistant",
        instructions="Help the user work with what they have open in Notepatra.",
        mcp_servers=[notepatra],
    )
    result = await Runner.run(agent, "What tabs do I have open?")

Any other MCP client

Anything that can launch a stdio MCP server works — Cursor, Windsurf, VS Code, or your own client. Configure it to run the command notepatra-mcp with the argument --socket. The server identifies itself as notepatra-mcp and advertises the tools, resources, and prompts capabilities.

Tip: running notepatra-mcp without --socket starts it against a built-in mock editor — handy for testing a client integration without Notepatra running.

Resources and prompts

Beyond tools, the server exposes two other MCP capabilities:

Resources

Clients that support MCP resources (Claude Desktop's attachment picker, for example) can pull a tab or note straight into the conversation without a tool call.

Prompts

PromptWhat it does
review-current-fileCode-review the file open in the active tab — embeds its live contents and language.
explain-selectionExplain the text currently selected in the editor.
summarize-notesSummarize your Noter notes (embeds up to the 3 most recent).

Limitations — the honest list

FAQ

Is my data sent anywhere?

Not by Notepatra. notepatra-mcp makes no network connections: it talks to your AI client over stdio (pipes between two processes on your machine) and to the editor over a local per-user socket. Nothing leaves the machine through this path. One honest caveat that applies to every MCP server: whatever your assistant reads through these tools becomes part of its conversation, and goes wherever that client sends its conversations — a local model stays local, a cloud model does not. Choose the client and model accordingly.

Can the AI edit my files without me noticing?

No. The only tools that can change a buffer or touch disk are the eight write tools, and each call requires you to click Approve on a card inside the editor within 120 seconds. No response means denied.

Is this the same as Notepatra's built-in AI Assistant?

No — they're complementary. The AI Assistant dock (Ctrl+Shift+A) is Notepatra talking to a model you configure. MCP is the reverse direction: an external assistant you already use (Claude, Codex, ...) talking to Notepatra. Neither requires the other.

Does it work with the Lite build?

Yes. The MCP bridge is part of the editor from v0.1.118 on both editions, and app_info reports which edition is running.

Which tab is index 0?

Tab indices are zero-based, exactly as shown in the tab bar — including the Welcome tab when it's open. Use list_open_tabs first rather than guessing indices.