Casey Hand/obsidian-mcp-server
Built by Metorial, the integration platform for agentic AI.
Casey Hand/obsidian-mcp-server
Server Summary
Integrate with Obsidian vaults
Manage knowledge bases
Execute secure API communication
Perform efficient file operations
Conduct comprehensive searches
Empower your AI agents and development tools with seamless Obsidian integration!
An MCP (Model Context Protocol) server providing comprehensive access to your Obsidian vault. Enables LLMs and AI agents to read, write, search, and manage your notes and files through the Obsidian Local REST API plugin.
Built on the cyanheads/mcp-ts-template
, this server follows a modular architecture with robust error handling, logging, and security features.
This server equips your AI with specialized tools to interact with your Obsidian vault:
Tool Name | Description | Key Features |
---|---|---|
obsidian_read_file | Retrieves the content and metadata of a specified file. | - Read in markdown or json format.- Case-insensitive path fallback.- Includes file stats (creation/modification time). |
obsidian_update_file | Modifies notes using whole-file operations. | - append , prepend , or overwrite content.- Can create files if they don't exist.- Targets files by path, active note, or periodic note. |
obsidian_search_replace | Performs search-and-replace operations within a target note. | - Supports string or regex search.- Options for case sensitivity, whole word, and replacing all occurrences. |
obsidian_global_search | Performs a search across the entire vault. | - Text or regex search.- Filter by path and modification date.- Paginated results. |
obsidian_list_files | Lists files and subdirectories within a specified vault folder. | - Filter by file extension or name regex.- Provides a formatted tree view of the directory. |
obsidian_manage_frontmatter | Atomically manages a note's YAML frontmatter. | - get , set , or delete frontmatter keys.- Avoids rewriting the entire file for metadata changes. |
obsidian_manage_tags | Adds, removes, or lists tags for a note. | - Manages tags in both YAML frontmatter and inline content. |
obsidian_delete_file | Permanently deletes a specified file from the vault. | - Case-insensitive path fallback for safety. |
| Overview | Features | Installation | | Configuration | Project Structure | Vault Cache Service | | Tools | Resources | Development | License |
The Obsidian MCP Server acts as a bridge, allowing applications (MCP Clients) that understand the Model Context Protocol (MCP) ā like advanced AI assistants (LLMs), IDE extensions, or custom scripts ā to interact directly and safely with your Obsidian vault.
Instead of complex scripting or manual interaction, your tools can leverage this server to:
Built on the robust mcp-ts-template
, this server provides a standardized, secure, and efficient way to expose Obsidian functionality via the MCP standard. It achieves this by communicating with the powerful Obsidian Local REST API plugin running inside your vault.
Developer Note: This repository includes a .clinerules file that serves as a developer cheat sheet for your LLM coding agent with quick reference for the codebase patterns, file locations, and code snippets.
Leverages the robust utilities provided by the mcp-ts-template
:
McpError
), and automatic logging.dotenv
) with comprehensive validation.zod
for schema validation and custom sanitization logic.ObsidianRestApiService
.npm install obsidian-mcp-server
git clone https://github.com/cyanheads/obsidian-mcp-server.git
cd obsidian-mcp-server
npm install
npm run build
This compiles the TypeScript code to JavaScript in the dist/
directory and makes the entry point executable.Configure the server using environment variables.
These variables must be set in the MCP client configuration (e.g., cline_mcp_settings.json
) or in your environment before starting the server (if running directly).
If running directly, they can be set in a .env
file in the project root or directly in your environment.
Variable | Description | Required | Default |
---|---|---|---|
OBSIDIAN_API_KEY | API Key from the Obsidian Local REST API plugin. | Yes | undefined |
OBSIDIAN_BASE_URL | Base URL of your Obsidian Local REST API. | Yes | http://127.0.0.1:27123 |
MCP_TRANSPORT_TYPE | Server transport: stdio or http . | No | stdio |
MCP_HTTP_PORT | Port for the HTTP server. | No | 3010 |
MCP_HTTP_HOST | Host for the HTTP server. | No | 127.0.0.1 |
MCP_ALLOWED_ORIGINS | Comma-separated origins for CORS. Set for production. | No | (none) |
MCP_AUTH_SECRET_KEY | 32+ char secret for JWT auth. Required for HTTP. | Yes (if HTTP) | undefined |
MCP_LOG_LEVEL | Logging level (debug , info , error , etc.). | No | info |
OBSIDIAN_VERIFY_SSL | Set to false to disable SSL verification. | No | true |
OBSIDIAN_ENABLE_CACHE | Set to true to enable the in-memory vault cache. | No | true |
OBSIDIAN_CACHE_REFRESH_INTERVAL_MIN | Refresh interval for the vault cache in minutes. | No | 10 |
To connect the MCP server to your Obsidian vault, you need to configure the base URL (OBSIDIAN_BASE_URL
) and API key (OBSIDIAN_API_KEY
). The Obsidian Local REST API plugin offers two ways to connect:
Encrypted (HTTPS) - Default:
https://
endpoint (e.g., https://127.0.0.1:27124
).OBSIDIAN_VERIFY_SSL
environment variable to "false"
. This tells the server to trust the self-signed certificate.Non-encrypted (HTTP) - Recommended for Simplicity:
http://
endpoint (e.g., http://127.0.0.1:27123
).Example env
configuration for your MCP client:
Using the non-encrypted HTTP URL (recommended):
"env": {
"OBSIDIAN_API_KEY": "YOUR_API_KEY_FROM_OBSIDIAN_PLUGIN",
"OBSIDIAN_BASE_URL": "http://127.0.0.1:27123"
}
Using the encrypted HTTPS URL:
"env": {
"OBSIDIAN_API_KEY": "YOUR_API_KEY_FROM_OBSIDIAN_PLUGIN",
"OBSIDIAN_BASE_URL": "https://127.0.0.1:27124",
"OBSIDIAN_VERIFY_SSL": "false"
}
Add to your MCP client settings (e.g., cline_mcp_settings.json
):
{
"mcpServers": {
"obsidian-mcp-server": {
"command": "node",
"args": ["/path/to/your/obsidian-mcp-server/dist/index.js"],
"env": {
"OBSIDIAN_API_KEY": "YOUR_OBSIDIAN_API_KEY",
"OBSIDIAN_BASE_URL": "http://127.0.0.1:27123",
"OBSIDIAN_VERIFY_SSL": "false",
"OBSIDIAN_ENABLE_CACHE": "true"
}
}
}
}
The codebase follows a modular structure within the src/
directory:
src/
āāā index.ts # Entry point: Initializes and starts the server
āāā config/ # Configuration loading (env vars, package info)
ā āāā index.ts
āāā mcp-server/ # Core MCP server logic and capability registration
ā āāā server.ts # Server setup, transport handling, tool/resource registration
ā āāā resources/ # MCP Resource implementations (currently none)
ā āāā tools/ # MCP Tool implementations (subdirs per tool)
ā āāā transports/ # Stdio and HTTP transport logic, auth middleware
āāā services/ # Abstractions for external APIs or internal caching
ā āāā obsidianRestAPI/ # Typed client for Obsidian Local REST API
āāā types-global/ # Shared TypeScript type definitions (errors, etc.)
āāā utils/ # Common utility functions (logger, error handler, security, etc.)
For a detailed file tree, run npm run tree
or see docs/tree.md.
This server includes an intelligent in-memory cache designed to enhance performance and resilience when interacting with your vault.
obsidian_global_search
tool. If the live API search fails or times out, the server seamlessly uses the cache to provide results, ensuring that search functionality remains available even if the Obsidian API is temporarily unresponsive.VaultCacheService
builds an in-memory map of all .md
files in your vault, storing their content and modification times.obsidian_update_file
, the service proactively updates the cache for that specific file, ensuring immediate consistency.obsidian_global_search
tool first attempts a live API search. If this fails, it automatically falls back to searching the in-memory cache.The cache is enabled by default but can be configured via environment variables:
OBSIDIAN_ENABLE_CACHE
: Set to true
(default) or false
to enable or disable the cache service.OBSIDIAN_CACHE_REFRESH_INTERVAL_MIN
: Defines the interval in minutes for the periodic background refresh. Defaults to 10
.The Obsidian MCP Server provides a suite of tools for interacting with your vault, callable via the Model Context Protocol.
Tool Name | Description | Key Arguments |
---|---|---|
obsidian_read_file | Retrieves the content and metadata of a file. | filePath , format? , includeStat? |
obsidian_update_file | Modifies a file by appending, prepending, or overwriting. | targetType , content , targetIdentifier? , wholeFileMode |
obsidian_search_replace | Performs search-and-replace operations in a note. | targetType , replacements , useRegex? , replaceAll? |
obsidian_global_search | Searches the entire vault for content. | query , searchInPath? , useRegex? , page? , pageSize? |
obsidian_list_files | Lists files and subdirectories in a folder. | dirPath , fileExtensionFilter? , nameRegexFilter? |
obsidian_manage_frontmatter | Gets, sets, or deletes keys in a note's frontmatter. | filePath , operation , key , value? |
obsidian_manage_tags | Adds, removes, or lists tags in a note. | filePath , operation , tags |
obsidian_delete_file | Permanently deletes a file from the vault. | filePath |
Note: All tools support comprehensive error handling and return structured JSON responses.
MCP Resources are not implemented in this version.
This server currently focuses on providing interactive tools for vault manipulation. Future development may introduce resource capabilities (e.g., exposing notes or search results as readable resources).
# Build the project (compile TS to JS in dist/ and make executable)
npm run build
# Format code using Prettier
npm run format
# Test the server locally using stdio transport
npm start
# or specifically:
npm run start:stdio
# Test the server locally using http transport
npm run start:http
# Generate a file tree representation for documentation (runs scripts/tree.ts)
npm run tree
# Clean build artifacts and then rebuild the project
npm run rebuild
# Fetch the Obsidian API spec (requires Obsidian running with Local REST API)
npm run fetch:spec http://127.0.0.1:27123/ docs/obsidian-api/obsidian_rest_api_spec
# Generate API documentation using TypeDoc
npm run docs:generate
# Inspect the server's capabilities using the MCP Inspector tool
npm run inspect:stdio
# or for the http transport:
npm run inspect:http
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
Built with the Model Context Protocol