mcp-notes
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| NOTES_DIR | No | Notes storage directory | ~/notes |
| NOTES_AUTO_INDEX | No | Auto-index on startup | true |
| NOTES_GIT_ENABLED | No | Enable git versioning | true |
| VECTOR_QDRANT_URL | No | Qdrant vector database URL | http://localhost:6333 |
| NOTES_GIT_USER_NAME | No | Git commit author | Notes MCP |
| NOTES_GIT_USER_EMAIL | No | Git commit email | notes@localhost |
| VECTOR_EMBEDDING_URL | No | OpenAI-compatible embedding API URL | http://localhost:8080 |
| VECTOR_EMBEDDING_MODEL | Yes | Embedding model name (no default provided) | |
| NOTES_COLLECTION_PREFIX | No | Qdrant collection prefix | notes |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| create_noteA | Create a new note with auto-generated UUID. Args: title: Note title content: Note body content (markdown) tags: Optional list of tags (lowercase, hyphenated) category: Optional category path (e.g., "work/projects") Returns: Created note as dict |
| read_noteB | Read a note by its UUID. Args: note_id: Note UUID string Returns: Note as dict |
| update_noteA | Update an existing note. Only provided fields are updated. Args: note_id: Note UUID string title: New title (optional, may cause file rename) content: New body content (optional) tags: New tags (optional, pass empty list to clear) category: New category (optional, may cause file move, pass empty string to clear) Returns: Updated note as dict |
| delete_noteA | Delete a note. The note is removed from the filesystem and search index, but remains recoverable from git history. Args: note_id: Note UUID string Returns: Success status |
| search_notesA | Hybrid semantic + keyword search across all notes. Query syntax supports filters:
Args: query: Search query with optional filters limit: Max results (default 10, max 100) tags: Additional tag filters category: Additional category filter after: Created after date (ISO format) before: Created before date (ISO format) Returns: List of search results |
| list_notesA | List notes with optional filtering. Args: tags: Filter by tags (all must match) category: Filter by category prefix sort_by: Sort field - "modified" (default), "created", or "title" limit: Max results (default 50, max 100) Returns: List of note summaries, or a single-item list with an error dict if sort_by is not one of the supported fields. |
| find_similar_notesA | Find notes semantically similar to the given note. Args: note_id: Source note UUID string limit: Max results (default 5, max 100) Returns: List of similar notes |
| get_note_historyA | Get version history for a note from git. Uses --follow to track history across file moves/renames. Args: note_id: Note UUID string limit: Max versions to return (default 10, max 100) Returns: List of version info |
| restore_note_versionA | Restore a note to a previous version (creates new commit). Args: note_id: Note UUID string version_id: Git commit SHA to restore from Returns: Restored note |
| get_note_linksA | Get incoming and outgoing links for a note. Args: note_id: Note UUID string Returns: NoteLinks with outgoing, incoming (backlinks), and broken links |
| list_tagsA | List all tags with note counts. Returns: List of tag info |
| rename_tagA | Rename a tag across all notes. Args: old_tag: Tag to rename new_tag: New tag name Returns: Count of notes updated, or error dict if validation fails |
| merge_tagsA | Merge multiple tags into one. Args: source_tags: Tags to merge from target_tag: Tag to merge into Returns: Count of notes updated, or error dict if validation fails |
| list_categoriesA | List all categories with note counts and hierarchy. Returns: Category tree |
| move_categoryA | Move/rename a category. Args: old_path: Current category path new_path: New category path Returns: Count of notes updated |
| reindex_notesA | Force reindex all notes (useful after manual file edits). Returns: Index status |
| check_note_healthA | Check health of all notes, reporting parse errors and issues. Returns: Health report with total notes, parse errors, and recommendations |
| add_glossary_entryA | Add a new glossary entry. Args: term: Canonical term (e.g., "USAF") expansion: Full expansion (e.g., "United States Air Force") definition: Detailed definition domain: Optional category (e.g., "military", "tech", "finance") aliases: Optional alternative terms that point to this entry Returns: Created entry as dict, or error dict for blank/duplicate input |
| lookup_termA | Exact lookup by term or alias (case-insensitive). Args: term: Term to look up (e.g., "usaf", "USAF", "US Air Force") Returns: Glossary entry if found, or error dict |
| search_glossaryA | Semantic search for glossary entries. Args: query: Natural language search query domain: Optional domain filter limit: Max results (default 10, max 100) Returns: List of matching entries with relevance scores, or error dict |
| list_glossaryA | List all glossary entries with optional domain filter. Args: domain: Optional domain filter limit: Max results (default 50, max 100) Returns: List of glossary entry summaries |
| update_glossary_entryA | Update an existing glossary entry. Only provided fields are updated. Args: term_or_id: Term (case-insensitive) or UUID to identify the entry term: New canonical term (optional) expansion: New expansion (optional) definition: New definition (optional) domain: New domain (optional, pass "" or null to clear) aliases: New aliases (optional, pass [] to clear) Returns: Updated entry as dict |
| delete_glossary_entryA | Delete a glossary entry by term or UUID. Args: term_or_id: Term (case-insensitive) or UUID string Returns: Success status or error |
| add_factA | Add a new fact (subject-predicate-object triple). Args: subject: Subject entity name (e.g., "John Smith") predicate: Relationship type (e.g., "works_at", "served_in") object: Object entity name (e.g., "Acme Corp") subject_type: Type of subject (e.g., "person", "organization") object_type: Type of object (e.g., "organization", "military_unit") context: Optional context description (e.g., "as squad leader") confidence: Confidence level 0.0-1.0 (1.0 = verified/manual) valid_from: Start date of validity (ISO format: YYYY-MM-DD) valid_to: End date of validity (ISO format: YYYY-MM-DD) source_type: Source type ("note", "document", "glossary", "manual") source_id: Source UUID (for notes/glossary) source_path: Source path (for documents) source_hash: Content hash (for documents) source_location: Location within source (e.g., "page 3") Returns: Created fact as dict |
| add_facts_batchA | Add multiple facts, committing each newly created fact independently. Args: facts: List of fact dicts, each with same fields as add_fact: - subject, predicate, object (required) - subject_type, object_type, context, confidence, valid_from, valid_to - source_type, source_id, source_path, source_hash, source_location Returns: Summary dict with added count, duplicates count, and any errors |
| update_factA | Update an existing fact's metadata. Note: Subject, predicate, and object are immutable (delete and recreate if needed). Args: fact_id: Fact UUID string context: New context description (omit or null leaves it unchanged; pass an empty string "" to set it blank) confidence: New confidence level 0.0-1.0 valid_from: New start date in ISO format (omit or null leaves it unchanged; pass an empty string "" to clear it) valid_to: New end date in ISO format (omit or null leaves it unchanged; pass an empty string "" to clear it) Returns: Updated fact as dict |
| delete_factC | Delete a fact and its sources. Args: fact_id: Fact UUID string Returns: Success status |
| query_factsB | Query facts by various criteria. Args: subject: Filter by subject (case-insensitive) predicate: Filter by predicate (case-insensitive) object: Filter by object (case-insensitive) subject_type: Filter by subject type object_type: Filter by object type min_confidence: Minimum confidence threshold valid_at: Filter by validity date (ISO format: YYYY-MM-DD) limit: Maximum results (1-100, default 50) Returns: List of matching facts |
| get_entityA | Get all facts involving an entity (as subject or object). Args: name: Entity name (case-insensitive) entity_type: Optional entity type filter Returns: Dict with entity info and related facts |
| list_factsB | List facts as lightweight summaries. Args: limit: Maximum results (1-100, default 50) subject_type: Filter by subject type object_type: Filter by object type predicate: Filter by predicate Returns: List of fact summaries |
| search_factsA | Semantic search across indexed facts. Args: query: Natural language search query limit: Maximum results (1-100, default 10) Returns: List of matching facts with scores |
| index_factsB | Index all facts for semantic search. Args: force: If True, reindex all facts. If False, only index new facts. Returns: Indexing result with counts |
| find_connectionsA | Find connections between entities using BFS graph traversal. Discovers how entities are related through chains of facts. Args: source_entity: Starting entity name target_entity: Target entity to find path to (optional) If None, returns all reachable entities up to max_depth source_type: Type of source entity (optional, for disambiguation) target_type: Type of target entity (optional, for disambiguation) max_depth: Maximum path length (1-10, default 3) limit: Maximum paths to return (1-100, default 10) Returns: List of connection paths, each containing: - path: List of facts connecting the entities - entities: List of entity names in the path |
| get_neighborsA | Get immediate neighbors of an entity in the fact graph. Returns all entities directly connected by a single fact. Args: entity: Entity name to get neighbors for entity_type: Type filter (optional, for disambiguation) Returns: List of neighbors with: - entity: Neighbor entity name - type: Neighbor entity type - predicate: Relationship predicate - direction: 'outgoing' (entity is subject) or 'incoming' (entity is object) - fact_id: UUID of connecting fact |
| get_facts_with_stale_sourcesA | Get facts with stale (deleted or modified) sources. Useful for identifying facts that may need review or re-verification. Args: status: Filter by source status: "deleted", "modified", or "all" (default) limit: Max results (default 50, max 100) Returns: List of facts with stale sources, or a single-item list with an error dict if status is not one of the supported values. |
| get_source_statisticsA | Get statistics about fact source integrity. Returns counts of sources by status across all facts. Returns: Dict with source counts by status and integrity score |
| check_fact_integrityA | Check integrity of a specific fact's sources. Returns breakdown of source statuses for the fact. Args: fact_id: Fact UUID string Returns: IntegrityCheckResult with source status breakdown |
| revalidate_fact_sourcesA | Reset modified/deleted sources back to active after re-verification. Use this after manually verifying that sources are still valid. Args: source_id: Optional source UUID to revalidate (e.g., a note or glossary entry UUID) source_type: Optional source type filter ("note", "glossary", "document") Returns: Count of sources revalidated |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| get_notes_index | Full index of all notes. |
| get_tags_resource | All tags with counts. |
| get_categories_resource | Category hierarchy with counts. |
| get_recent_notes | Recently modified notes (last 20). |
| get_orphan_notes | Notes with no incoming links. |
| get_broken_links_resource | All broken [[uuid]] references. |
| get_parse_errors_resource | Notes that failed to parse (corrupted or malformed). |
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/michaelkrauty/mcp-notes'
If you have feedback or need assistance with the MCP directory API, please join our Discord server