{
  "markdown": "# Smart Connections MCP Server\n\n**Give Claude true semantic memory of your Obsidian vault.** An MCP server that\nsearches your notes by *meaning* — reusing the embeddings the\n[Smart Connections](https://github.com/brianpetro/obsidian-smart-connections)\nObsidian plugin already generated, and running the same embedding model locally\nto understand your queries. No cloud calls; your vault never leaves your machine.\n\n[![MCP](https://img.shields.io/badge/MCP-Model_Context_Protocol-1f6feb)](https://modelcontextprotocol.io/)\n[![Obsidian](https://img.shields.io/badge/Obsidian-Smart_Connections-7c3aed)](https://github.com/brianpetro/obsidian-smart-connections)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![GitHub stars](https://img.shields.io/github/stars/msdanyg/smart-connections-mcp?style=social)](https://github.com/msdanyg/smart-connections-mcp/stargazers)\n\n## What it does\n\n- **`search_notes`** — semantic search across one or many vaults. Matches whole\n  notes *and* individual sections (blocks), returns similarity-ranked results\n  with content snippets.\n- **`get_similar_notes`** — notes similar to a given note (stored embeddings).\n- **`get_connection_graph`** — walk similarity links outward to map related ideas.\n- **`get_note_content`** — read a note, or extract specific blocks.\n- **`list_vaults` / `get_stats`** — what's loaded, counts, models, load errors.\n\n## Requirements\n\n- Node.js 20+\n- An Obsidian vault with the Smart Connections plugin installed and embeddings\n  generated (v2 tested against Smart Connections 3.x data)\n- An MCP client (Claude Desktop, Claude Code, …)\n\n## Setup (Claude Desktop)\n\nAdd to `claude_desktop_config.json` and restart Claude Desktop:\n\n```json\n{\n  \"mcpServers\": {\n    \"smart-connections\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"smart-connections-mcp\"],\n      \"env\": {\n        \"SMART_VAULT_PATH\": \"/path/to/Vault One,/path/to/Vault Two\"\n      }\n    }\n  }\n}\n```\n\nOne vault or several — separate paths with commas.\n\n`SMART_VAULT_PATHS` (plural) is also accepted as an alias for `SMART_VAULT_PATH` and takes\nprecedence over it if both are set.\n\n### Claude Code\n\n```bash\nclaude mcp add smart-connections -e SMART_VAULT_PATH=\"/path/to/vault\" -- npx -y smart-connections-mcp\n```\n\n## How it works\n\nSmart Connections stores an embedding vector for every note and block in\n`.smart-env/`. This server loads those vectors into memory and, when you search,\nembeds your query with the *same model* your vault used (downloaded once,\n~25MB, runs locally via transformers.js). Results are ranked by cosine\nsimilarity. Edits you make in Obsidian are picked up automatically.\n\nIf the embedding model can't load (e.g. no network on very first run), or a vault\nhas no embeddings yet, search degrades to literal keyword matching and says so\nexplicitly (`\"mode\": \"keyword-fallback\"` plus a `warning` naming the cause). When only some vaults fall back, `mode` stays\n`\"semantic\"`, those rows carry `\"match\": \"keyword\"`, and they always rank\nafter the true semantic rows.\n\n## Migrating from v1\n\n- `get_embedding_neighbors` was removed.\n- `search_notes` is now genuinely semantic and its response includes `vault`,\n  `scope`, `block`, `snippet`, and `mode` fields.\n- Everything else is backward compatible; single-vault `SMART_VAULT_PATH`\n  configs work unchanged.\n\n## Development\n\n```bash\nnpm install\nnpm test              # build + CI-tier tests (no network)\nnpm run test:live     # + real-model tests (downloads ~25MB once)\nnpm run smoke -- \"/path/to/vault\" \"your query\"\n```\n\nMIT — see [LICENSE](LICENSE).\n",
  "bytes": 3575,
  "sha": "c7beb1a685a77af3dae337d22b24767369fc791a1ff60ddbf36b59b758dafabb",
  "repo_slug": "msdanyg/smart-connections-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_msdanyg_smart_connections_mcp_03e754ca/readme"
}