mcp-notes
Personal knowledge management server with note CRUD, semantic search, git versioning, wiki linking, tags, glossary, and fact graph capabilities.
README
mcp-notes
MCP server for personal knowledge management with semantic search, git versioning, and knowledge graph capabilities.
Prerequisites
- Python 3.12+
- Linux or macOS (uses POSIX file locking via vector-core; not compatible with Windows)
- Qdrant vector database (default:
localhost:6333) - An OpenAI-compatible embedding API (e.g., llama.cpp, Ollama, or any
/v1/embeddingsendpoint; default:localhost:8080) - git (must be on PATH for versioning features)
Installation
Requires vector-core.
pip install git+https://github.com/michaelkrauty/vector-core.git@v1.2.11
pip install git+https://github.com/michaelkrauty/mcp-notes.git
Or clone both repos and install locally:
git clone https://github.com/michaelkrauty/vector-core.git
git clone https://github.com/michaelkrauty/mcp-notes.git
pip install -e vector-core/
pip install -e mcp-notes/
Quick Start
# Register with Claude Code:
claude mcp add notes -- mcp-notes
# Or add to your MCP client config (e.g., claude_desktop_config.json):
# {
# "mcpServers": {
# "notes": {
# "command": "mcp-notes",
# "env": {
# "VECTOR_QDRANT_URL": "http://localhost:6333",
# "VECTOR_EMBEDDING_URL": "http://localhost:8080",
# "VECTOR_EMBEDDING_MODEL": "your-model-name"
# }
# }
# }
# }
Features
- Note Management: CRUD operations on markdown notes with YAML frontmatter
- Semantic Search: Hybrid dense + sparse vector search via Qdrant
- Git Versioning: Automatic commits on changes, full history with
--follow - Wiki Linking:
[[uuid]]syntax for inter-note references with backlink tracking - Tags & Categories: Flexible organization with tag management tools
- Glossary: Shared term definitions with aliases and domains
- Fact Graph: Subject-predicate-object triples with source tracking
Tools (38 total)
Notes (4)
| Tool | Description |
|---|---|
create_note |
Create note with auto-generated UUID |
read_note |
Read note by UUID |
update_note |
Update title, content, tags, or category |
delete_note |
Delete note (keeps git history) |
Search (3)
| Tool | Description |
|---|---|
search_notes |
Hybrid semantic + keyword search with filters |
list_notes |
List notes with tag/category filters |
find_similar_notes |
Find semantically similar notes |
Versioning (2)
| Tool | Description |
|---|---|
get_note_history |
Git commit history for a note |
restore_note_version |
Restore note to previous commit |
Links (1)
| Tool | Description |
|---|---|
get_note_links |
Outgoing, incoming (backlinks), and broken links |
Tags (3)
| Tool | Description |
|---|---|
list_tags |
All tags with note counts |
rename_tag |
Rename tag across all notes |
merge_tags |
Merge multiple tags into one |
Categories (2)
| Tool | Description |
|---|---|
list_categories |
Category hierarchy with counts |
move_category |
Move/rename a category |
Glossary (6)
| Tool | Description |
|---|---|
add_glossary_entry |
Add term with expansion, definition, domain |
lookup_term |
Exact lookup by term or alias |
search_glossary |
Semantic glossary search |
list_glossary |
List entries with optional domain filter |
update_glossary_entry |
Modify entry metadata |
delete_glossary_entry |
Delete entry |
Facts (11)
| Tool | Description |
|---|---|
add_fact |
Add SPO triple with source tracking |
add_facts_batch |
Batch import facts |
update_fact |
Update fact metadata |
delete_fact |
Delete fact and sources |
query_facts |
Query by subject/predicate/object |
get_entity |
All facts involving an entity |
list_facts |
List fact summaries |
search_facts |
Semantic fact search |
index_facts |
Index facts for search |
find_connections |
BFS graph traversal between entities |
get_neighbors |
Immediate entity connections |
Integrity (4)
| Tool | Description |
|---|---|
get_facts_with_stale_sources |
Facts with deleted/modified sources |
get_source_statistics |
Source integrity stats |
check_fact_integrity |
Check specific fact's sources |
revalidate_fact_sources |
Reset sources after verification |
Health (2)
| Tool | Description |
|---|---|
reindex_notes |
Force full reindex |
check_note_health |
Validate note structure, find errors |
Data Model
Note
---
id: {uuid}
title: Note Title
created: 2024-01-01T00:00:00Z
modified: 2024-01-05T12:00:00Z
tags: [tag1, tag2]
links: [linked-uuid]
---
Markdown content with [[uuid]] links.
Fact (SPO Triple)
subject: "Ada Lovelace" (type: person)
predicate: "works_at"
object: "Babbage Labs" (type: organization)
context: "as lead engineer"
confidence: 1.0
valid_from/to: date range
sources: [{type: note, id: uuid, location: "paragraph 3"}]
Storage
| Data | Location |
|---|---|
| Notes | {NOTES_DIR}/notes/ (default ~/notes/notes/) |
| UUID index | {NOTES_DIR}/.index/ |
| Vectors | Qdrant collection notes_{hash} |
| Git repo | {NOTES_DIR}/.git/ |
| Facts & glossary | ~/.local/share/vector-core/ (configurable via VECTOR_SHARED_DATA_DIR) |
NOTES_DIR (default ~/notes) is the base directory. Actual note files live in the notes/ subdirectory within it. The base directory also contains .index/, .git/, and .locks/.
Notes stored as {slug}-{uuid}.md organized by category subdirectories.
Configuration
| Variable | Default | Description |
|---|---|---|
NOTES_DIR |
~/notes |
Notes storage directory |
NOTES_GIT_ENABLED |
true |
Enable git versioning |
NOTES_GIT_USER_NAME |
Notes MCP |
Git commit author |
NOTES_GIT_USER_EMAIL |
notes@localhost |
Git commit email |
NOTES_AUTO_INDEX |
true |
Auto-index on startup |
NOTES_COLLECTION_PREFIX |
notes |
Qdrant collection prefix |
Plus inherited vector-core settings (VECTOR_QDRANT_URL, VECTOR_EMBEDDING_URL, etc.).
Search Query Syntax
# Filter by tag
tag:project-x
# Exclude a tag
-tag:archived
# Filter by category (exact match)
category:work/projects
# Date filters
after:2024-01-01
before:2024-06-30
# Title search
title:meeting notes
# Combined
project tag:active category:work after:2024-01-01
MCP Resources
Static data endpoints:
notes://index- Full note indexnotes://tags- All tags with countsnotes://categories- Category hierarchynotes://recent- Last 20 modified notesnotes://orphans- Notes with no backlinksnotes://broken-links- Broken reference summarynotes://parse-errors- Notes that failed to parse
Dependencies
Requires vector-core components:
- EmbeddingClient, GlobalVocabulary (search)
- QdrantStorage (storage)
- GlossaryStore, FactStore (knowledge graph)
External libraries:
- GitPython (versioning)
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.