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 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| 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_noteA | 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_notesB | 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_tagC | 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_entryB | 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_factA | 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_factsA | 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_statisticsB | 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_integrityB | 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
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- 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