{"id":31474873,"url":"https://github.com/bitbonsai/mcp-obsidian","last_synced_at":"2025-10-01T23:01:59.337Z","repository":{"id":316114748,"uuid":"1061403997","full_name":"bitbonsai/mcp-obsidian","owner":"bitbonsai","description":"A lightweight Model Context Protocol (MCP) server for safe Obsidian vault access","archived":false,"fork":false,"pushed_at":"2025-09-26T10:52:07.000Z","size":218,"stargazers_count":73,"open_issues_count":0,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-30T18:36:09.468Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bitbonsai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-21T20:50:15.000Z","updated_at":"2025-09-30T05:25:59.000Z","dependencies_parsed_at":"2025-09-22T20:15:23.070Z","dependency_job_id":"139e0fa6-3f03-40f6-b768-6ab853953aa2","html_url":"https://github.com/bitbonsai/mcp-obsidian","commit_stats":null,"previous_names":["bitbonsai/mcp-obsidian"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bitbonsai/mcp-obsidian","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitbonsai%2Fmcp-obsidian","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitbonsai%2Fmcp-obsidian/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitbonsai%2Fmcp-obsidian/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitbonsai%2Fmcp-obsidian/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bitbonsai","download_url":"https://codeload.github.com/bitbonsai/mcp-obsidian/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitbonsai%2Fmcp-obsidian/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":277926261,"owners_count":25900535,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-01T02:00:09.286Z","response_time":88,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-10-01T23:01:14.984Z","updated_at":"2025-10-01T23:01:59.329Z","avatar_url":"https://github.com/bitbonsai.png","language":"TypeScript","readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg width=\"256\" height=\"256\" alt=\"image\" src=\"https://github.com/user-attachments/assets/1e21d898-811b-42c2-a810-bf921dde0f58\" /\u003e\n\u003c/div\u003e\n\n# MCP-Obsidian\n\nA universal AI bridge for Obsidian vaults using the Model Context Protocol (MCP) standard. Connect any MCP-compatible AI assistant to your knowledge base - works with Claude, ChatGPT, and future AI tools. This server provides safe read/write access to your notes while preventing YAML frontmatter corruption.\n\n\u003cdiv align=\"center\"\u003e\n  \n[https://mcp-obsidian.org](https://mcp-obsidian.org)\n\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n[![GitHub Stars](https://img.shields.io/github/stars/bitbonsai/mcp-obsidian?style=flat\u0026logo=github\u0026logoColor=white\u0026color=9065ea\u0026labelColor=262626)](https://github.com/bitbonsai/mcp-obsidian) \n[![GitHub Sponsors](https://img.shields.io/github/sponsors/BitBonsai?style=flat\u0026logo=github\u0026logoColor=white\u0026color=9065ea\u0026labelColor=262626)](https://github.com/sponsors/bitbonsai) \n[![GitHub Sponsors](https://img.shields.io/github/sponsors/BitBonsai?style=flat\u0026logo=github\u0026logoColor=white\u0026color=9065ea\u0026labelColor=262626)](https://github.com/sponsors/bitbonsai) \n[![Ko-Fi](https://img.shields.io/badge/Ko--fi-Support%20Me-9065ea?style=flat\u0026logo=ko-fi\u0026logoColor=white\u0026labelColor=262626)](https://ko-fi.com/bitbonsai) \n[![Liberapay](https://img.shields.io/badge/Liberapay-Weekly%20Support-9065ea?style=flat\u0026logo=liberapay\u0026logoColor=white\u0026labelColor=262626)](https://liberapay.com/bitbonsai/)\n\n\u003c/div\u003e\n\n\n\n## Universal Compatibility\nWorks with any MCP-compatible AI assistant including Claude Desktop, Claude Code, ChatGPT Desktop (Enterprise+), IntelliJ IDEA 2025.1+, Cursor IDE, Windsurf IDE, and future AI platforms that adopt the MCP standard.\n\nhttps://github.com/user-attachments/assets/657ac4c6-1cd2-4cc3-829f-fd095a32f71c\n\n## Quick Start (5 minutes)\n\n1. **Install Node.js runtime:**\n   ```bash\n   # Download from https://nodejs.org (v18.0.0 or later)\n   # or use a package manager like nvm, brew, apt, etc.\n   ```\n\n2. **Test the server:**\n\n   If using the published package:\n   ```bash\n   npx @modelcontextprotocol/inspector npx @mauricio.wolff/mcp-obsidian@latest /path/to/your/vault\n   ```\n\n3. **Configure your AI client:**\n\n   **Claude Desktop** - Copy this to `claude_desktop_config.json`:\n   ```json\n   {\n     \"mcpServers\": {\n       \"obsidian\": {\n         \"command\": \"npx\",\n         \"args\": [\"@mauricio.wolff/mcp-obsidian@latest\", \"/path/to/your/vault\"]\n       }\n     }\n   }\n   ```\n\n   **Claude Code** - Copy this to `~/.claude.json`:\n   ```json\n   {\n     \"mcpServers\": {\n       \"obsidian\": {\n         \"command\": \"npx\",\n         \"args\": [\"@mauricio.wolff/mcp-obsidian@latest\", \"/path/to/your/vault\"],\n         \"env\": {}\n       }\n     }\n   }\n   ```\n\n   Replace `/path/to/your/vault` with your actual Obsidian vault path.\n\n   For other platforms, see [detailed configuration guides](#ai-client-configuration) below.\n\n4. **Test with your AI:**\n   - \"List files in my Obsidian vault\"\n   - \"Read my note called 'project-ideas.md'\"\n   - \"Create a new note with today's date\"\n\n**Success indicators:** Your AI should be able to list files and read notes from your vault.\n\n## Why MCP-Obsidian?\n\n### Universal AI Compatibility\nBuilt on the open Model Context Protocol standard, MCP-Obsidian is not locked to any single AI provider. As more AI assistants adopt MCP, your investment in this tool grows more valuable. Today it works with Claude and ChatGPT - tomorrow it will work with whatever AI tools emerge.\n\n### Future-Proof Your Knowledge Base\nInstead of waiting for each AI company to build Obsidian integrations, MCP-Obsidian provides a universal adapter that works with any MCP-compatible assistant. One tool, endless possibilities.\n\n### Open Standard, No Lock-in\nMCP is an open protocol. You're not tied to any specific vendor or platform. Your notes remain yours, accessible through any compatible AI assistant.\n\n## Features\n\n- ✅ Safe frontmatter parsing and validation using gray-matter\n- ✅ Path filtering to exclude `.obsidian` directory and other system files\n- ✅ **Complete MCP toolkit**: 11 methods covering all vault operations\n  - File operations: `read_note`, `write_note`, `delete_note`, `move_note`\n  - Directory operations: `list_directory`\n  - Batch operations: `read_multiple_notes`\n  - Search: `search_notes` with content and frontmatter support\n  - Metadata: `get_frontmatter`, `update_frontmatter`, `get_notes_info`\n  - Tag management: `manage_tags` (add, remove, list)\n- ✅ Write modes: `overwrite`, `append`, `prepend` for flexible content editing\n- ✅ Tag management: add, remove, and list tags in notes\n- ✅ Safe deletion with confirmation requirement to prevent accidents\n- ✅ Automatic path trimming to handle whitespace in inputs\n- ✅ TypeScript support with Node.js runtime (using tsx for execution)\n- ✅ Comprehensive error handling and validation\n- ✅ **Performance optimized**: No unnecessary token consumption, efficient for large vaults\n- ✅ **Zero dependencies**: No Obsidian plugins required, works with any vault structure\n- ✅ **Intelligent link handling**: Smart processing of internal links and references\n\n## Prerequisites\n\n- [Node.js](https://nodejs.org) runtime (v18.0.0 or later)\n- An Obsidian vault (local directory with `.md` files)\n- MCP-compatible AI client (Claude Desktop, ChatGPT Desktop, Claude Code, etc.)\n\n## Installation\n\n### For End Users (Recommended)\n\nNo installation needed! Use `npx` to run directly:\n\n```bash\nnpx @mauricio.wolff/mcp-obsidian@latest /path/to/your/obsidian/vault\n```\n\n### For Developers\n\n1. Clone this repository\n2. Install dependencies with npm:\n```bash\nnpm install\n```\n\n3. Test locally with MCP inspector:\n```bash\nnpx @modelcontextprotocol/inspector npm start /path/to/your/vault\n```\n\n**Pro tip:** Use MCP Inspector to test all server functionality before configuring with AI clients:\n```bash\n# Install globally for easier access\nnpm install -g @modelcontextprotocol/inspector\n\n# Test with any vault\nmcp-inspector npx @mauricio.wolff/mcp-obsidian@latest /path/to/your/vault\n```\n\n## Usage\n\n### Running the Server\n\n**End users:**\n```bash\nnpx @mauricio.wolff/mcp-obsidian@latest /path/to/your/obsidian/vault\n```\n\n**Developers:**\n```bash\nnpm start /path/to/your/obsidian/vault\n```\n\n### AI Client Configuration\n\n#### Claude Desktop\n\nAdd to your Claude Desktop configuration file:\n\n**Single Vault:**\n```json\n{\n  \"mcpServers\": {\n    \"obsidian\": {\n      \"command\": \"npx\",\n      \"args\": [\"@mauricio.wolff/mcp-obsidian@latest\", \"/Users/yourname/Documents/MyVault\"]\n    }\n  }\n}\n```\n\n**Multiple Vaults:**\n```json\n{\n  \"mcpServers\": {\n    \"obsidian-personal\": {\n      \"command\": \"npx\",\n      \"args\": [\"@mauricio.wolff/mcp-obsidian@latest\", \"/Users/yourname/Documents/PersonalVault\"]\n    },\n    \"obsidian-work\": {\n      \"command\": \"npx\",\n      \"args\": [\"@mauricio.wolff/mcp-obsidian@latest\", \"/Users/yourname/Documents/WorkVault\"]\n    }\n  }\n}\n```\n\n**Configuration File Locations:**\n- **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`\n- **Windows:** `C:\\Users\\{username}\\AppData\\Roaming\\Claude\\claude_desktop_config.json`\n- **Linux:** `~/.config/Claude/claude_desktop_config.json`\n\n*You can also access this through Claude Desktop → Settings → Developer → Edit Config*\n\n#### ChatGPT Desktop\n\n**Requirements:** ChatGPT Enterprise, Education, or Team subscription (not available for individual Plus users)\n\nChatGPT uses MCP through Deep Research and developer mode. Configuration is done through the ChatGPT interface:\n\n1. Access ChatGPT developer mode (beta feature)\n2. Configure MCP servers through the built-in MCP client\n3. Create custom connectors for your organization\n\n*Note: ChatGPT Desktop's MCP integration is currently limited to enterprise subscriptions and uses a different setup process than file-based configuration.*\n\n#### Claude Code\n\nClaude Code uses `.claude.json` configuration file:\n\n**User-scoped (recommended):**\nEdit `~/.claude.json`:\n```json\n{\n  \"mcpServers\": {\n    \"obsidian\": {\n      \"command\": \"npx\",\n      \"args\": [\"@mauricio.wolff/mcp-obsidian@latest\", \"/path/to/your/vault\"],\n      \"env\": {}\n    }\n  }\n}\n```\n\n**Project-scoped:**\nEdit `.claude.json` in your project or add to the projects section:\n```json\n{\n  \"projects\": {\n    \"/path/to/your/project\": {\n      \"mcpServers\": {\n        \"obsidian\": {\n          \"command\": \"npx\",\n          \"args\": [\"@mauricio.wolff/mcp-obsidian@latest\", \"/path/to/your/vault\"]\n        }\n      }\n    }\n  }\n}\n```\n\n**Using Claude Code CLI:**\n```bash\nclaude mcp add obsidian --scope user npx @mauricio.wolff/mcp-obsidian /path/to/your/vault\n```\n\n#### Other MCP-Compatible Clients (2025)\n\n**Confirmed MCP Support:**\n- **IntelliJ IDEA 2025.1+** - Native MCP client support\n- **Cursor IDE** - Built-in MCP compatibility\n- **Windsurf IDE** - Full MCP integration\n- **Zed, Replit, Codeium, Sourcegraph** - In development\n- **Microsoft Copilot Studio** - Native MCP support with one-click server connections\n\nMost modern MCP clients use similar JSON configuration patterns. Refer to your specific client's documentation for exact setup instructions.\n\n### Examples\n\n#### Ask your AI assistant about your notes:\n- \"What files are in my Obsidian vault?\"\n- \"Read my note called 'project-ideas.md'\"\n- \"Show me all notes with 'AI' in the title\"\n\n#### Have your AI assistant help with note management:\n- \"Create a new note called 'meeting-notes.md' with today's date in the frontmatter\"\n- \"Append today's journal entry to my daily note\"\n- \"Prepend an urgent task to my todo list\"\n- \"Add the tags 'project' and 'urgent' to my task note\"\n- \"List all tags in my research note\"\n- \"Remove the 'draft' tag from my completed article\"\n- \"List all markdown files in my 'Projects' folder\"\n- \"Delete the old draft note 'draft-ideas.md' (with confirmation)\"\n\n#### Advanced Use Cases:\n- **Knowledge Synthesis**: \"Summarize all my research notes tagged with 'machine-learning' from the last month\"\n- **Project Management**: \"Update the status in all project notes to 'completed' and add today's date\"\n- **Content Analysis**: \"Find all notes that mention 'API design' and create a comprehensive guide\"\n- **Smart Tagging**: \"Review my untagged notes and suggest appropriate tags based on content\"\n\n## Troubleshooting\n\n### Common Issues\n\n#### \"command not found: npx\"\n- **Solution:** Install Node.js runtime from [nodejs.org](https://nodejs.org)\n- **Alternative:** Use global install: `npm install -g @mauricio.wolff/mcp-obsidian`\n\n#### \"Usage: node server.ts /path/to/vault\"\n- **Cause:** No vault path provided\n- **Solution:** Specify the full path to your Obsidian vault directory\n\n#### \"Permission denied\" errors\n- **Cause:** Insufficient file system permissions\n- **Solution:** Ensure the vault directory is readable/writable by your user\n\n#### \"Path traversal not allowed\"\n- **Cause:** Trying to access files outside the vault\n- **Solution:** All file paths must be relative to the vault root\n\n#### AI client not recognizing the server\n1. Check the configuration file path is correct for your OS\n2. Ensure JSON syntax is valid (use a JSON validator)\n3. Restart your AI client after configuration changes\n4. Check your AI client's logs for error messages\n5. Verify your AI client supports MCP (Model Context Protocol)\n\n#### \".obsidian files still showing up\"\n- **Expected:** The path filter automatically excludes `.obsidian/**` patterns\n- **If still seeing them:** The filter is working as designed for security\n\n### Debug Mode\n\nRun with error logging:\n```bash\nnpx @mauricio.wolff/mcp-obsidian /path/to/vault 2\u003edebug.log\n```\n\n### Getting Help\n\n- [Open an issue](https://github.com/bitbonsai/mcp-obsidian/issues) on GitHub\n- Include your OS, Node.js version, and error messages\n- Provide the vault directory structure (without sensitive content)\n\n## Testing\n\nRun the test suite:\n```bash\nnpm test\n```\n\n## API Methods\n\n### `read_note`\nRead a note from the vault with parsed frontmatter.\n\n**Request:**\n```json\n{\n  \"name\": \"read_note\",\n  \"arguments\": {\n    \"path\": \"project-ideas.md\"\n  }\n}\n```\n\n**Response:**\n```json\n{\n  \"path\": \"project-ideas.md\",\n  \"frontmatter\": {\n    \"title\": \"Project Ideas\",\n    \"tags\": [\"projects\", \"brainstorming\"],\n    \"created\": \"2023-01-15T10:30:00.000Z\"\n  },\n  \"content\": \"# Project Ideas\\n\\n## AI Tools\\n- MCP server for Obsidian\\n- Voice note transcription\\n\\n## Web Apps\\n- Task management system\"\n}\n```\n\n### `write_note`\nWrite a note to the vault with optional frontmatter and write mode.\n\n**Write Modes:**\n- `overwrite` (default): Replace entire file content\n- `append`: Add content to the end of existing file\n- `prepend`: Add content to the beginning of existing file\n\n**Request (Overwrite):**\n```json\n{\n  \"name\": \"write_note\",\n  \"arguments\": {\n    \"path\": \"meeting-notes.md\",\n    \"content\": \"# Team Meeting\\n\\n## Agenda\\n- Project updates\\n- Next milestones\",\n    \"frontmatter\": {\n      \"title\": \"Team Meeting Notes\",\n      \"date\": \"2023-12-01\",\n      \"tags\": [\"meetings\", \"team\"]\n    },\n    \"mode\": \"overwrite\"\n  }\n}\n```\n\n**Request (Append):**\n```json\n{\n  \"name\": \"write_note\",\n  \"arguments\": {\n    \"path\": \"daily-log.md\",\n    \"content\": \"\\n\\n## 3:00 PM Update\\n- Completed project review\\n- Started new feature\",\n    \"mode\": \"append\"\n  }\n}\n```\n\n**Response:**\n```json\n{\n  \"message\": \"Successfully wrote note: meeting-notes.md (mode: overwrite)\"\n}\n```\n\n### `list_directory`\nList files and directories in the vault.\n\n**Request:**\n```json\n{\n  \"name\": \"list_directory\",\n  \"arguments\": {\n    \"path\": \"Projects\"\n  }\n}\n```\n\n**Response:**\n```json\n{\n  \"path\": \"Projects\",\n  \"directories\": [\n    \"AI-Tools\",\n    \"Web-Development\"\n  ],\n  \"files\": [\n    \"project-template.md\",\n    \"roadmap.md\"\n  ]\n}\n```\n\n### `delete_note`\nDelete a note from the vault (requires confirmation for safety).\n\n**Request:**\n```json\n{\n  \"name\": \"delete_note\",\n  \"arguments\": {\n    \"path\": \"old-draft.md\",\n    \"confirmPath\": \"old-draft.md\"\n  }\n}\n```\n\n**Response (Success):**\n```json\n{\n  \"success\": true,\n  \"path\": \"old-draft.md\",\n  \"message\": \"Successfully deleted note: old-draft.md. This action cannot be undone.\"\n}\n```\n\n**Response (Confirmation Failed):**\n```json\n{\n  \"success\": false,\n  \"path\": \"old-draft.md\",\n  \"message\": \"Deletion cancelled: confirmation path does not match. For safety, both 'path' and 'confirmPath' must be identical.\"\n}\n```\n\n**⚠️ Safety Note:** The `confirmPath` parameter must exactly match the `path` parameter to proceed with deletion. This prevents accidental deletions.\n\n### `get_frontmatter`\nExtract only the frontmatter from a note without reading the full content.\n\n**Request:**\n```json\n{\n  \"name\": \"get_frontmatter\",\n  \"arguments\": {\n    \"path\": \"project-ideas.md\"\n  }\n}\n```\n\n**Response:**\n```json\n{\n  \"path\": \"project-ideas.md\",\n  \"frontmatter\": {\n    \"title\": \"Project Ideas\",\n    \"tags\": [\"projects\", \"brainstorming\"],\n    \"created\": \"2023-01-15T10:30:00.000Z\"\n  }\n}\n```\n\n### `manage_tags`\nAdd, remove, or list tags in a note. Tags are managed in the frontmatter and inline tags are detected.\n\n**Request (List Tags):**\n```json\n{\n  \"name\": \"manage_tags\",\n  \"arguments\": {\n    \"path\": \"research-notes.md\",\n    \"operation\": \"list\"\n  }\n}\n```\n\n**Request (Add Tags):**\n```json\n{\n  \"name\": \"manage_tags\",\n  \"arguments\": {\n    \"path\": \"research-notes.md\",\n    \"operation\": \"add\",\n    \"tags\": [\"machine-learning\", \"ai\", \"important\"]\n  }\n}\n```\n\n**Request (Remove Tags):**\n```json\n{\n  \"name\": \"manage_tags\",\n  \"arguments\": {\n    \"path\": \"research-notes.md\",\n    \"operation\": \"remove\",\n    \"tags\": [\"draft\", \"temporary\"]\n  }\n}\n```\n\n**Response:**\n```json\n{\n  \"path\": \"research-notes.md\",\n  \"operation\": \"add\",\n  \"tags\": [\"research\", \"ai\", \"machine-learning\", \"important\"],\n  \"success\": true,\n  \"message\": \"Successfully added tags\"\n}\n```\n\n### `search_notes`\nSearch for notes in the vault by content or frontmatter.\n\n**Request:**\n```json\n{\n  \"name\": \"search_notes\",\n  \"arguments\": {\n    \"query\": \"machine learning\",\n    \"limit\": 5,\n    \"searchContent\": true,\n    \"searchFrontmatter\": false,\n    \"caseSensitive\": false\n  }\n}\n```\n\n**Response:**\n```json\n{\n  \"query\": \"machine learning\",\n  \"resultCount\": 3,\n  \"results\": [\n    {\n      \"path\": \"ai-research.md\",\n      \"title\": \"AI Research Notes\",\n      \"excerpt\": \"...machine learning algorithms are...\",\n      \"matchCount\": 2,\n      \"lineNumber\": 15\n    }\n  ]\n}\n```\n\n### `move_note`\nMove or rename a note in the vault.\n\n**Request:**\n```json\n{\n  \"name\": \"move_note\",\n  \"arguments\": {\n    \"oldPath\": \"drafts/article.md\",\n    \"newPath\": \"published/article.md\",\n    \"overwrite\": false\n  }\n}\n```\n\n**Response:**\n```json\n{\n  \"success\": true,\n  \"oldPath\": \"drafts/article.md\",\n  \"newPath\": \"published/article.md\",\n  \"message\": \"Successfully moved note from drafts/article.md to published/article.md\"\n}\n```\n\n### `read_multiple_notes`\nRead multiple notes in a batch (maximum 10 files).\n\n**Request:**\n```json\n{\n  \"name\": \"read_multiple_notes\",\n  \"arguments\": {\n    \"paths\": [\"note1.md\", \"note2.md\", \"note3.md\"],\n    \"includeContent\": true,\n    \"includeFrontmatter\": true\n  }\n}\n```\n\n**Response:**\n```json\n{\n  \"successful\": [\n    {\n      \"path\": \"note1.md\",\n      \"frontmatter\": {\"title\": \"Note 1\"},\n      \"content\": \"# Note 1\\n\\nContent here...\"\n    }\n  ],\n  \"failed\": [\n    {\n      \"path\": \"note2.md\",\n      \"error\": \"File not found\"\n    }\n  ],\n  \"summary\": {\n    \"successCount\": 1,\n    \"failureCount\": 1\n  }\n}\n```\n\n### `update_frontmatter`\nUpdate frontmatter of a note without changing content.\n\n**Request:**\n```json\n{\n  \"name\": \"update_frontmatter\",\n  \"arguments\": {\n    \"path\": \"research-note.md\",\n    \"frontmatter\": {\n      \"status\": \"completed\",\n      \"updated\": \"2025-09-23\"\n    },\n    \"merge\": true\n  }\n}\n```\n\n**Response:**\n```json\n{\n  \"message\": \"Successfully updated frontmatter for: research-note.md\"\n}\n```\n\n### `get_notes_info`\nGet metadata for notes without reading full content.\n\n**Request:**\n```json\n{\n  \"name\": \"get_notes_info\",\n  \"arguments\": {\n    \"paths\": [\"note1.md\", \"note2.md\"]\n  }\n}\n```\n\n**Response:**\n```json\n{\n  \"notes\": [\n    {\n      \"path\": \"note1.md\",\n      \"size\": 1024,\n      \"modified\": 1695456000000,\n      \"hasFrontmatter\": true\n    }\n  ],\n  \"count\": 1\n}\n```\n\n## Security Considerations\n\nThis MCP server implements several security measures to protect your Obsidian vault:\n\n### Path Security\n- **Path Traversal Protection:** All file paths are validated to prevent access outside the vault\n- **Relative Path Enforcement:** Paths are normalized and restricted to the vault directory\n- **Symbolic Link Safety:** Resolved paths are checked against vault boundaries\n\n### File Filtering\n- **Automatic Exclusions:** `.obsidian`, `.git`, `node_modules`, and system files are filtered\n- **Extension Whitelist:** Only `.md`, `.markdown`, and `.txt` files are accessible by default\n- **Hidden File Protection:** Dot files and system directories are automatically excluded\n\n### Content Validation\n- **YAML Frontmatter Validation:** Frontmatter is parsed and validated before writing\n- **Function/Symbol Prevention:** Dangerous JavaScript objects are blocked from frontmatter\n- **Data Type Checking:** Only safe data types (strings, numbers, arrays, objects) allowed\n\n### Best Practices\n- **Least Privilege:** Server only accesses the specified vault directory\n- **Read-Only by Default:** Consider running with read-only permissions for sensitive vaults\n- **Backup Recommended:** Always backup your vault before using write operations\n- **Network Isolation:** Server uses stdio transport (no network exposure)\n\n### What's NOT Protected\n- **File Content:** The server can read/write any allowed file content\n- **Vault Structure:** Directory structure is visible to AI assistants\n- **File Metadata:** Creation times, file sizes, etc. are accessible\n\n**⚠️ Important:** Only grant vault access to trusted AI conversations. The server provides full read/write access to your notes within the security boundaries above.\n\n## Architecture\n\n- `server.ts` - MCP server entry point\n- `src/frontmatter.ts` - YAML frontmatter handling with gray-matter\n- `src/filesystem.ts` - Safe file operations with path validation\n- `src/pathfilter.ts` - Directory and file filtering\n- `src/search.ts` - Note search functionality with content and frontmatter support\n- `src/types.ts` - TypeScript type definitions\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch: `git checkout -b feature-name`\n3. Make your changes and add tests\n4. Ensure all tests pass: `npm test`\n5. Submit a pull request\n\n## License\n\nMIT\n","funding_links":["https://github.com/sponsors/bitbonsai","https://ko-fi.com/bitbonsai","https://liberapay.com/bitbonsai/"],"categories":["Productivity","Content Management Mcp Servers","📚 Projects (1974 total)","Knowledge \u0026 Memory","MCP Servers"],"sub_categories":["Obsidian","MCP Servers","Knowledge \u0026 Memory"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbitbonsai%2Fmcp-obsidian","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbitbonsai%2Fmcp-obsidian","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbitbonsai%2Fmcp-obsidian/lists"}