obsidian_search
Search your Obsidian vault using JsonLogic queries to find notes by content, tags, file patterns, or complex criteria for Zettelkasten workflows.
Instructions
Search vault using powerful JsonLogic queries.
Essential for Zettelkasten workflow: find notes by patterns, content, tags, or complex criteria.
Uses JsonLogic for flexible and powerful searches across your vault.
Args:
params (SearchInput): Contains:
- query (Dict): JsonLogic query object
Returns:
str: List of matching files
Common Examples:
1. Find all markdown files:
{'glob': ['*.md', {'var': 'path'}]}
2. Search for text in content (case-insensitive):
{'in': ['search term', {'lower': [{'var': 'content'}]}]}
3. Find files by name pattern:
{'glob': ['*zettel*', {'var': 'path'}]}
4. Combine conditions (files with "system" in content):
{'and': [
{'glob': ['*.md', {'var': 'path'}]},
{'in': ['system', {'lower': [{'var': 'content'}]}]}
]}
JsonLogic Documentation: https://jsonlogic.com/
Available variables: 'path' (file path), 'content' (file content), 'stat' (file stats)
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Implementation Reference
- The handler function implementing the obsidian_search tool. It takes a JsonLogic query, sends it to the Obsidian API via obsidian_client.post, processes the results to list matching file paths, and handles errors.async def search_vault(params: SearchInput) -> str: """Search vault using powerful JsonLogic queries. Essential for Zettelkasten workflow: find notes by patterns, content, tags, or complex criteria. Uses JsonLogic for flexible and powerful searches across your vault. Args: params (SearchInput): Contains: - query (Dict): JsonLogic query object Returns: str: List of matching files Common Examples: 1. Find all markdown files: {'glob': ['*.md', {'var': 'path'}]} 2. Search for text in content (case-insensitive): {'in': ['search term', {'lower': [{'var': 'content'}]}]} 3. Find files by name pattern: {'glob': ['*zettel*', {'var': 'path'}]} 4. Combine conditions (files with "system" in content): {'and': [ {'glob': ['*.md', {'var': 'path'}]}, {'in': ['system', {'lower': [{'var': 'content'}]}]} ]} JsonLogic Documentation: https://jsonlogic.com/ Available variables: 'path' (file path), 'content' (file content), 'stat' (file stats) """ try: # Use special content type for JsonLogic queries result = await obsidian_client.post( "/search/", params.query, # Send query directly, not wrapped content_type="application/vnd.olrapi.jsonlogic+json" ) # API returns array of {filename, result} objects if not result or not isinstance(result, list): return "No files matched the search criteria." # Filter for successful matches matches = [item["filename"] for item in result if item.get("result")] if not matches: return "No files matched the search criteria." output = [f"# Search Results\n"] output.append(f"Found {len(matches)} matching files\n") for filepath in matches: output.append(f"- 📄 {filepath}") response = "\n".join(output) return truncate_response(response, "search results") except ObsidianAPIError as e: return json.dumps({ "error": str(e), "success": False }, indent=2)
- Pydantic input schema for the obsidian_search tool, defining the JsonLogic query parameter.class SearchInput(BaseModel): """Input for vault searches using JsonLogic queries.""" model_config = ConfigDict(extra='forbid') query: Dict[str, Any] = Field( description="JsonLogic query object for searching vault. Examples: {'glob': ['*.md', {'var': 'path'}]} for all markdown files, {'in': ['search term', {'lower': [{'var': 'content'}]}]} for text search" )
- src/custom_obsidian_mcp/server.py:554-563 (registration)MCP tool registration decorator for the obsidian_search tool, specifying name and annotations.@mcp.tool( name="obsidian_search", annotations={ "title": "Search Vault", "readOnlyHint": True, "destructiveHint": False, "idempotentHint": True, "openWorldHint": False } )