mor
Allows syncing notes with a git repository, enabling version control and synchronization across machines via pull, commit, and push operations.
Allows generating embeddings for notes using local Ollama models to augment full-text search with vector similarity.
Allows generating embeddings for notes using OpenAI's text-embedding models (e.g., text-embedding-3-small) to augment full-text search with vector similarity.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@morfind notes about python"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mor
This is a personal project. I maintain it for my own use and share it because others might find it useful. Feature PRs are unlikely to be merged — if you have an idea,start a discussion first. Fork freely — it's MIT licensed.
AI-accessible knowledge you actually own. Plain markdown files on your disk, searchable by AI via MCP.
Your notes live on your disk as plain markdown with YAML frontmatter — readable without mor, portable to any tool, git-syncable across machines. The MCP server gives AI assistants (Claude Code, Claude Desktop, Cursor, etc.) persistent memory that survives context windows. You also get a CLI and HTTP API.
Install
npm install -g morRequires Node.js 20+.
Related MCP server: Markdown Notes MCP Server
Quick start
# Add notes
echo "Always use snake_case for Python variables" | mor add -t "Python naming"
mor add notes.md -t "Meeting notes" --tags "meeting,project-x"
mor add https://raw.githubusercontent.com/owner/repo/main/config.ts
# Search (FTS5 — tokenized, stemmed)
mor find python naming
# Grep (literal substring or regex)
mor grep snake_case
mor grep -i todo
mor grep -E "async\s+function"
mor grep -w Beer -n -C 2
# Read, edit, copy, remove
mor cat python naming
mor edit python naming
mor cp -o ./out.md python naming
mor rm python naming
# List
mor ls
mor ls -lCommands
Command | Description |
| Full-text search ( |
| Substring or regex search ( |
| Add from file, URL, stdin, or |
| Print content ( |
| Copy content to file ( |
| Open in |
| Update metadata or content ( |
| Apply a |
| Remove a note |
| Show cross-references for a note ( |
| List all ( |
| Pull, commit, and push the notes folder via git |
| Rebuild search index |
| Import |
| Start MCP server (stdio) |
| Start HTTP server ( |
| Authenticate with a remote server via OAuth ( |
Queries resolve in order: full UUID, UUID prefix (8+ chars), filename, FTS search. Multi-word queries don't need quoting — options go before the query: mor find --limit 5 python naming.
find, grep, and ls support shared filters: --type, --tag, --repo, --ext (all support glob patterns).
MCP server
Add to your Claude Code or Claude Desktop config:
{
"mcpServers": {
"mor": {
"command": "mor",
"args": ["mcp"]
}
}
}Tools: notes_search, notes_read, notes_create, notes_update, notes_patch, notes_remove, notes_list, notes_grep.
To make sure Claude Code checks mor first when you ask it to recall something, add this to ~/.claude/CLAUDE.md:
## Notes
When the user asks to recall, find, check, or reuse something they previously saved
or remembered — use the `mor` MCP server tools (`notes_search`, `notes_read`,
`notes_list`). This is the user's primary note store containing code snippets,
files, and reference notes. Always check mor before saying something wasn't found.Remote access
Run the server on one machine, access from anywhere:
# Server
mor serve --port 7677 --token mypassphrase --mcpMCP clients (Claude Code, Claude Desktop, etc.)
Point your MCP client at the server URL — no secret in the config:
{
"mcpServers": {
"mor": {
"type": "url",
"url": "http://mybox.tail1234.ts.net:7677/mcp"
}
}
}The client discovers auth via WWW-Authenticate → OAuth metadata → browser passphrase flow, all automatic.
CLI client
# OAuth login — saves server URL to config and credentials to credentials.json
mor login -s http://mybox.tail1234.ts.net:7677
# All commands now proxy to the remote server
mor find "python naming"Or configure a direct token instead:
// ~/.config/mor/config.json
{
"server": {
"url": "http://mybox.tail1234.ts.net:7677",
"token": "mypassphrase",
},
}OAuth tokens auto-refresh on expiry.
Authentication
When --token is set, all routes require auth. Two methods work everywhere:
Bearer token:
Authorization: Bearer <passphrase>or?token=<passphrase>OAuth access token: obtained via the OAuth flow (
mor loginor MCP client auto-discovery)
Unauthenticated requests get a 401 with a WWW-Authenticate header pointing to the OAuth discovery endpoint.
HTTP API
Method | Path | Description |
|
| Health check |
|
| List all |
|
| FTS search |
|
| Substring or regex search |
|
| Read one |
|
| Get forward and backlinks |
|
| Create ( |
|
| Update ( |
|
| Patch content ( |
|
| Remove |
|
| Rebuild the search index |
|
| Git pull, commit, push |
|
| MCP protocol (streamable HTTP) |
Embeddings
Optionally augment FTS search with vector similarity. Configure in config.json:
{
"embedding": {
"provider": "openai",
"model": "text-embedding-3-small",
"dimensions": 1536
}
}Providers: openai (or compatible API via baseUrl), azure-openai, ollama. Run mor reindex after configuring.
Azure OpenAI uses AZURE_OPENAI_API_KEY (or apiKey in config) and requires a deployment name (defaults to model name).
Storage
Notes are markdown files with YAML frontmatter, split across XDG directories. Set MOR_HOME for a single flat directory.
~/.config/mor/ # config
config.json
~/.local/share/mor/ # data
notes/
python-naming-a1b2.md
meeting-notes-c3d4.md
~/.local/state/mor/ # state
index.db # search index
credentials.json # OAuth tokens (mor login)
oauth.db # OAuth server tokensFiles are human-readable and git-friendly. Use mor sync to pull, commit, and push if the notes folder is a git repo. Enable autosync to sync automatically after every add, update, or remove:
{
"autosync": true
}License
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/laat/mor'
If you have feedback or need assistance with the MCP directory API, please join our Discord server