mcp-notes-server
TypeScript MCP server that gives AI assistants a searchable notes store (6 typed tools)
Install / Use
claude mcp add techsaurabh-394 -- npx -y github:techsaurabh-394/mcp-notes-serverIf the server publishes to npm under a different name, use that package instead — check the repo README.
MCP Server
Model Context Protocol server
Quality Score
Category
AI & Machine LearningSupported Platforms
Tags
Our assessment of mcp-notes-server
mcp-notes-server scores 80/100 on our quality scale, 759th of 938 AI & Machine Learning skills we index.
Its MCP Server is 16 KB long, well organised into 28 sections with 20 code examples: a thorough specification that gives an agent plenty to work with.
It has 3 GitHub stars, so there is little community track record yet; judge it on its content.
Maintenance, license and trust
- The repository was last updated today, so mcp-notes-server is actively maintained.
- It is released under the MIT license, a permissive license that allows use, modification and commercial use with attribution.
- Its trust signals score 87/100, with 2 cautions from licensing, adoption, age or documentation. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
mcp-notes-server compared with similar skills
All 4 of these similar skills score higher than mcp-notes-server; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| mcp-notes-server (this skill)by techsaurabh-394 | 80 | 3 | today | MCP Server |
| claude-memby thedotmack | 100 | 102.9k | today | CLAUDE.md |
| Agent-Reachby Panniantong | 100 | 101.9k | today | CLAUDE.md |
| Understand-Anythingby Egonex-AI | 100 | 88.1k | 2d ago | CLAUDE.md |
| headroomby headroomlabs-ai | 100 | 77.7k | today | CLAUDE.md |
Frequently asked questions
- How do I install mcp-notes-server?
- Run
claude mcp add techsaurabh-394 -- npx -y github:techsaurabh-394/mcp-notes-server. The install tabs above show the steps for each supported agent. - Which AI agents does mcp-notes-server work with?
- It is written for Claude Code and Claude Desktop, as a MCP Server file. Other agents that read the same format can often use it too.
- Is mcp-notes-server safe to use?
- It is MIT-licensed and scores 87/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is mcp-notes-server still maintained?
- The repository was last updated today, so mcp-notes-server is actively maintained.
Skill content
View source on GitHubmcp-notes-server
Give your AI assistant a notebook it can write in, search and remember.
A small, fully tested Model Context Protocol server in TypeScript: 6 tools, 2 resources and 1 prompt, backed by a single JSON file.
</div>What does this do? (30 seconds)
You run this small program next to your AI app (Claude Desktop, Claude Code, ...). The assistant gains tools to save, find, edit and delete notes, and the notes survive between chats because they live in a file on your computer.
You: Remember this: for RAG, use 800-char chunks with overlap. Tag it rag.
Assistant: (calls add_note) -> Saved note b265a3ff: RAG chunking
Assistant: Saved it as a note tagged "rag".
... days later, in a new chat ...
You: What did I decide about chunk size?
Assistant: (calls search_notes with "chunk")
[b265a3ff] RAG chunking #rag
use 800-char chunks with overlap
Assistant: You decided on 800-character chunks with overlap.
The ids and exact wording above come from a real run of the server; the assistant's own replies will vary.
What is MCP?
The Model Context Protocol is an open standard that lets AI apps (like Claude) talk to outside programs in one uniform way, a bit like USB-C for AI. Instead of custom glue for every assistant, you write one MCP server that offers tools (actions the AI can run), resources (data it can read) and prompts (reusable templates), and any MCP client can discover and use them.
Learn MCP step by step: ai-engineer-roadmap / 06-mcp
Table of contents
- Quick start
- Connect it to your AI app
- How a request flows
- Tools reference
- Resources and prompt
- Where notes are stored
- Security design
- Troubleshooting
- Testing and development
- Project layout
- Roadmap
Quick start
Option A: run from npm (no clone)
With Node.js 18 or newer:
npx -y mcp-notes-server
You should see mcp-notes-server running on stdio and then nothing else; the server is waiting for an MCP client. Press Ctrl+C to stop. To use it from an AI app, see Connect it to your AI app.
Option B: build from source
You need Node.js 18 or newer (CI runs Node 22) and git.
git clone https://github.com/techsaurabh-394/mcp-notes-server.git
cd mcp-notes-server
npm install
npm run build # compiles src/ to dist/
npm test # optional: builds and runs the test suite
Check that the server starts:
node dist/index.js
You should see mcp-notes-server running on stdio and then nothing else. That is correct: the server is now waiting for an MCP client to talk to it. Press Ctrl+C to stop. You normally never run it by hand; your AI app starts it for you (next section).
Want to poke at it without an AI app? Use the MCP Inspector:
npx @modelcontextprotocol/inspector node dist/index.js
Open the printed URL to browse and call the tools, resources and prompt.
Connect it to your AI app
With npx (no clone): Claude Code: claude mcp add notes -- npx -y mcp-notes-server. Claude Desktop: use "command": "npx" and "args": ["-y", "mcp-notes-server"] in the config below instead of the node lines.
From a clone: first find the absolute path to the built server. From inside the cloned folder:
echo "$(pwd)/dist/index.js"
Use that output wherever you see /absolute/path/to/mcp-notes-server/dist/index.js below. An absolute path starts at the root of your disk (for example /Users/you/mcp-notes-server/dist/index.js), because the AI app does not start in your project folder.
Claude Desktop
Add this to claude_desktop_config.json (in Claude Desktop: Settings, Developer, Edit Config):
{
"mcpServers": {
"notes": {
"command": "node",
"args": ["/absolute/path/to/mcp-notes-server/dist/index.js"],
"env": { "NOTES_FILE": "/absolute/path/to/notes.json" }
}
}
}
NOTES_FILE is optional. Leave out the whole env line to use the default location. Fully quit and restart Claude Desktop, then try:
- "Save a note titled RAG chunking with the content use 800-char chunks with overlap, tag it rag."
- "Search my notes for chunking."
- "Change the tags on that note to rag and search."
Claude Code
claude mcp add notes -- node /absolute/path/to/mcp-notes-server/dist/index.js
# optional: custom storage file
claude mcp add notes --env NOTES_FILE=/absolute/path/to/notes.json -- node /absolute/path/to/mcp-notes-server/dist/index.js
Run claude mcp list to confirm. Other MCP clients (Cursor, etc.) work the same way: point them at node dist/index.js over stdio.
How a request flows
Tools reference
| Tool | What it does | Hints |
|---|---|---|
| add_note | Save a note with title, content and optional tags | Writes |
| get_note | Fetch one note by id | Read-only |
| list_notes | List notes newest first, optionally by tag | Read-only |
| search_notes | Keyword search over titles, tags and bodies (title matches rank highest) | Read-only |
| update_note | Edit title, content and/or tags (tags replace existing ones) | Writes, idempotent |
| delete_note | Permanently delete a note by id | Destructive |
Problems (unknown id, malformed id, empty update, delete of a missing id) come back as results with isError: true and a clear message, not as crashes. The examples below show the text a tool returns.
add_note
Save a new note. Returns the note id.
| Parameter | Type | Required | Limits |
|---|---|---|---|
| title | string | yes | 1 to 200 characters; trimmed before saving |
| content | string | yes | 1 to 20000 characters |
| tags | array of strings | no | at most 10; lowercased, trimmed, blanks and duplicates removed |
{ "title": "RAG chunking", "content": "use 800-char chunks with overlap", "tags": ["RAG", "Search"] }
Result: Saved note b265a3ff: RAG chunking (tags are stored as rag, search)
get_note
Fetch one note by id, with full content.
| Parameter | Type | Required | Limits |
|---|---|---|---|
| id | string | yes | must match ^[a-f0-9]{8}$ |
{ "id": "b265a3ff" }
Result:
[b265a3ff] RAG chunking #rag #search
use 800-char chunks with overlap
Errors: Invalid note id "nope": ids are 8 hex characters (see list_notes). for a malformed id, No note with id deadbeef. for an unknown one.
list_notes
List notes, newest first, one line each (no content).
| Parameter | Type | Required | Limits |
|---|---|---|---|
| tag | string | no | exact match after trimming and lowercasing |
{ "tag": "rag" }
Result: [b265a3ff] RAG chunking #rag #search. With no notes: No notes found.
search_notes
Keyword search across titles, tags and bodies. Returns the best matches with full content, separated by ---.
| Parameter | Type | Required | Limits |
|---|---|---|---|
| query | string | yes | at least 1 character; space-separated keywords |
| limit | integer | no | 1 to 20; default 5 |
Scoring per keyword: title contains it +3, a tag equals it +2, body contains it +1. Matching is case-insensitive. Notes with a score of 0 are dropped.
{ "query": "chunking", "limit": 3 }
Result:
[b265a3ff] RAG chunking #rag #search
use 800-char chunks with overlap
No match: No notes match "zzz".
update_note
Edit an existing note. Provide the id and at least one of title, content, tags. Fields you leave out are unchanged. tags, if given, replaces all existing tags (use [] to clear them).
| Parameter | Type | Required | Limits |
|---|---|---|---|
| id | string | yes | must match ^[a-f0-9]{8}$ |
| title | string | no | 1 to 200 characters |
| content | string | no | 1 to 20000 characters |
| tags | array of strings | no | at most 10; normalised like add_note |
{ "id": "b265a3ff", "tags": ["rag"] }
Result: Updated note b265a3ff: RAG chunking
Errors: Nothing to update: provide at least one of title, content or tags., No note with id deadbeef.
delete_note
Permanently delete one note by id. This cannot be undone.
| Parameter | Type | Required | Limits |
|---|---|---|---|
| id | string | yes | at least 1 character |
{ "id": "b265a3ff" }
Result: Deleted note b265a3ff. An id that does not exist returns an error: No note with id deadbeef.
Resources and prompt
| Type | Name / URI | Description |
|---|---|---|
| Resource | notes://all | Every note, newest first, as plain text (No notes yet. when empty) |
| Resource template | notes://{id} | One note by id; each note is also listed individually |
| Prompt | review_notes (optional tag) | Asks the model to summarise your notes, flag duplicates and suggest better tags |
Reading notes://all returns text like:
[b265a3ff] RAG chunking #rag
use 800-char chunks with overlap
Several notes are separated by a --- line. Reading notes://b265a3ff returns that one note in the same format; a malformed or unknown id is an error.
review_notes with { "tag": "rag" } produces one user message:
Review the following notes tagged "rag". Summarise the key points, flag duplicates or contradictions, and suggest better tags.
[b265a3ff] RAG chunking #rag
use 800-char chunks with overlap
Where notes are stored
Notes live in one JSON file: ~/.mcp-notes/notes.json by default, or the path in the NOTES_FILE environment variable. The folder is created if missing. Writes are atomic (temp file + rename), so a crash mid-write does not leave a half-written file.
Security design
