{
  "slug": "io-github-sweir1-obsidian-brain",
  "name": "io.github.sweir1/obsidian-brain",
  "title": "Obsidian Brain",
  "description": "Obsidian MCP server: semantic search, knowledge graph, and vault editing. No plugin required.",
  "version": "1.7.24",
  "publishedAt": "2026-05-16T15:24:45.386473Z",
  "updatedAt": "2026-05-16T15:24:45.386473Z",
  "repoUrl": "https://github.com/sweir1/obsidian-brain",
  "websiteUrl": "https://sweir1.github.io/obsidian-brain/",
  "namespace": {
    "type": "github",
    "owner": "sweir1"
  },
  "kind": "local",
  "packages": [
    {
      "registryType": "npm",
      "identifier": "obsidian-brain",
      "version": "1.7.24",
      "transport": "stdio",
      "runtimeHint": "npx"
    }
  ],
  "remotes": [],
  "envVars": [
    {
      "name": "VAULT_PATH",
      "isSecret": false,
      "isRequired": true,
      "description": "Absolute path to your Obsidian vault (or any folder of .md files)."
    },
    {
      "name": "DATA_DIR",
      "isSecret": false,
      "isRequired": false,
      "description": "Where to store the SQLite index + embedding cache. Defaults to $XDG_DATA_HOME/obsidian-brain or ~/.local/share/obsidian-brain."
    },
    {
      "name": "EMBEDDING_PRESET",
      "isSecret": false,
      "isRequired": false,
      "description": "Preset name: english (default, bge-small-en-v1.5), english-fast, english-quality, multilingual, multilingual-quality, multilingual-ollama. Ignored when EMBEDDING_MODEL is set."
    },
    {
      "name": "EMBEDDING_MODEL",
      "isSecret": false,
      "isRequired": false,
      "description": "Power-user override: any transformers.js checkpoint or Ollama model id. Takes precedence over EMBEDDING_PRESET. Switching auto-reindexes."
    },
    {
      "name": "EMBEDDING_PROVIDER",
      "isSecret": false,
      "isRequired": false,
      "description": "Embedding backend. 'transformers' (local, default) or 'ollama' (requires a running Ollama server)."
    },
    {
      "name": "OLLAMA_BASE_URL",
      "isSecret": false,
      "isRequired": false,
      "description": "Base URL of a local Ollama server. Only used when EMBEDDING_PROVIDER=ollama."
    },
    {
      "name": "OLLAMA_EMBEDDING_DIM",
      "isSecret": false,
      "isRequired": false,
      "description": "Override the embedding dimensionality when EMBEDDING_PROVIDER=ollama. If unset, the server probes the model on startup."
    },
    {
      "name": "OLLAMA_NUM_CTX",
      "isSecret": false,
      "isRequired": false,
      "description": "Override Ollama's num_ctx for embed requests. Leave UNSET to let obsidian-brain auto-detect via `/api/show`'s `context_length` (e.g. nomic-embed-text=2048, bge-m3=8192, qwen3-embedding:0.6b=32 768). Setting this manually imposes a hard cap and may silently truncate longer inputs — see https://github.com/ollama/ollama/issues/14259. Ollama's own default is 2048 which truncates for any model trained on a larger context. See also https://github.com/ollama/ollama/issues/7008. Fallback when both env is unset AND /api/show is unreachable: 8192."
    },
    {
      "name": "OBSIDIAN_BRAIN_OLLAMA_AUTO_PULL",
      "isSecret": false,
      "isRequired": false,
      "description": "Auto-pull the configured Ollama model when /api/show returns 404 (model not present). Default ON — choosing an Ollama-backed preset is implicit consent to download its model. Streams /api/pull progress to stderr. Set to '0' to disable auto-pull entirely (master kill-switch) and fall back to the actionable error path (`HTTP 404 — try: ollama pull <model>`)."
    },
    {
      "name": "OBSIDIAN_BRAIN_OLLAMA_BYOM_AUTO_PULL",
      "isSecret": false,
      "isRequired": false,
      "description": "Opt-in to auto-pull for BYOM (custom EMBEDDING_MODEL) Ollama models OUTSIDE Ollama's official `library/` namespace. Default OFF — third-party models (e.g. `user/custom-fork`, `myregistry.com/team/model`) require this env var to be set to `1` before they will auto-pull, to prevent silent downloads of arbitrary user-named artifacts. Preset-known models (via EMBEDDING_PRESET) and bare model ids in the official library (e.g. `qwen3-embedding:0.6b`, `library/llama3:8b`) continue to auto-pull by default per the existing OBSIDIAN_BRAIN_OLLAMA_AUTO_PULL behavior."
    },
    {
      "name": "OBSIDIAN_BRAIN_NO_WATCH",
      "isSecret": false,
      "isRequired": false,
      "description": "Set to '1' to disable the live chokidar file watcher. Useful on SMB/NFS vaults where FSEvents/inotify don't fire reliably — fall back to running `obsidian-brain index` on a schedule (launchd/systemd)."
    },
    {
      "name": "OBSIDIAN_BRAIN_NO_CATCHUP",
      "isSecret": false,
      "isRequired": false,
      "description": "Set to '1' to skip the startup catchup reindex pass that picks up edits made while the server was down. The live file watcher still starts (via OBSIDIAN_BRAIN_NO_WATCH=1 to disable that separately), and first-time indexing on an empty DB is unaffected — this knob only governs the post-restart `enqueueBackgroundReindex` walk."
    },
    {
      "name": "OBSIDIAN_BRAIN_WATCH_DEBOUNCE_MS",
      "isSecret": false,
      "isRequired": false,
      "description": "Per-file reindex debounce for the live watcher, in milliseconds."
    },
    {
      "name": "OBSIDIAN_BRAIN_COMMUNITY_DEBOUNCE_MS",
      "isSecret": false,
      "isRequired": false,
      "description": "Graph-wide community-detection (Louvain) debounce for the live watcher, in milliseconds. Louvain is the only expensive op — batching it prevents per-edit CPU spikes."
    },
    {
      "name": "OBSIDIAN_BRAIN_TOOL_TIMEOUT_MS",
      "isSecret": false,
      "isRequired": false,
      "description": "Per-tool-call timeout in milliseconds. Tools exceeding this return an MCP error instead of hanging."
    },
    {
      "name": "OBSIDIAN_BRAIN_MAX_CHUNK_TOKENS",
      "isSecret": false,
      "isRequired": false,
      "description": "Override the adaptive chunk-size budget (in tokens). When set, this beats the capacity probed from the model's tokenizer or Ollama /api/show. Use for debugging or for models with stale tokenizer configs."
    },
    {
      "name": "OBSIDIAN_BRAIN_CONFIG_DIR",
      "isSecret": false,
      "isRequired": false,
      "description": "Override the per-user config directory where obsidian-brain stores model overrides (`model-overrides.json`) and the user-fetched seed (`seed-models.json`). Default is `$XDG_CONFIG_HOME/obsidian-brain` on macOS/Linux (or `~/.config/obsidian-brain`) and `%APPDATA%/obsidian-brain` on Windows. Both files survive `npm update obsidian-brain` because they live outside the package."
    },
    {
      "name": "OBSIDIAN_BRAIN_DEBUG",
      "isSecret": false,
      "isRequired": false,
      "description": "Set to \"1\" to print a verbose synchronous startup trace to stderr — every preflight, createContext, server.connect, and shutdown step is logged with a monotonic timestamp. The LAST line before any silent failure tells you exactly which step the server reached. No-op when unset (no overhead). Use to diagnose silent-crash failure modes."
    },
    {
      "name": "OBSIDIAN_BRAIN_LOG_FORMAT",
      "isSecret": false,
      "isRequired": false,
      "description": "Set to 'ndjson' for one-JSON-object-per-line stderr output (timestamp + level + message + structured fields). Default is human-readable plain text (`obsidian-brain: <message>`). Useful for piping logs into aggregators (Datadog, Loki, Vector, journald) that index structured fields."
    }
  ],
  "category": "productivity",
  "subcategory": "notes",
  "company": "",
  "categoryAuto": true,
  "checks": [
    {
      "id": "source-linked",
      "label": "Source repository linked",
      "result": "pass",
      "detail": "https://github.com/sweir1/obsidian-brain"
    },
    {
      "id": "version-pinned",
      "label": "Version pinned",
      "result": "pass",
      "detail": "Every package has an explicit version"
    },
    {
      "id": "secrets-requested",
      "label": "Secrets requested",
      "result": "info",
      "detail": "Asks for no secrets"
    },
    {
      "id": "known-registry",
      "label": "Known package registry",
      "result": "pass",
      "detail": "All packages come from npm, PyPI, OCI, NuGet or MCPB"
    },
    {
      "id": "namespace",
      "label": "Namespace ownership",
      "result": "info",
      "detail": "Name verified via GitHub account sweir1"
    },
    {
      "id": "meta-text",
      "label": "Registry text aimed at the AI",
      "result": "pass",
      "detail": "Description and settings contain no hidden characters or instructions to the AI"
    },
    {
      "id": "install-scripts",
      "label": "Install scripts",
      "result": "warn",
      "detail": "Runs at install: postinstall: npm rebuild better-sqlite3 || (echo 'obsidian-brain: postinstall rebuild of better-sqlite3 FAILED — your install may cra"
    },
    {
      "id": "code-flags",
      "label": "Code red flags",
      "result": "pass",
      "detail": "Read 212 files in obsidian-brain@1.7.24: no obfuscation, encoded execution, credential reads or data-collection endpoints found"
    },
    {
      "id": "ai-text",
      "label": "Text aimed at the AI",
      "result": "pass",
      "detail": "No hidden characters or instructions to the AI in 212 files, including comments and the README"
    }
  ],
  "scannedAt": "2026-10-29",
  "level": "Scanned",
  "install": [
    {
      "label": "Claude Desktop (npm)",
      "kind": "claude_desktop_json",
      "text": "{\n  \"mcpServers\": {\n    \"obsidian-brain\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"-y\",\n        \"obsidian-brain@1.7.24\"\n      ],\n      \"env\": {\n        \"VAULT_PATH\": \"<your value>\"\n      }\n    }\n  }\n}"
    }
  ],
  "curated": true,
  "stars": 14,
  "archived": false,
  "pushedAt": "2026-08-12T20:32:59Z",
  "health": {
    "score": 51,
    "parts": {
      "popularity": 0.37783501450439316,
      "activity": 0.48,
      "issues": null,
      "security": 0.8
    },
    "fail": 0,
    "warn": 1,
    "raw": {
      "stars": 14,
      "forks": 3,
      "downloads": 359,
      "hn": null,
      "issuesOpen": 6,
      "issuesClosed": 0,
      "prsMerged": 7,
      "commits90": 0,
      "release": "2026-05-16T15:24:46Z",
      "pushed": "2026-08-12T20:32:59Z",
      "growth": null,
      "growthDays": null,
      "archived": false
    },
    "at": "2026-10-31T07:42:38.200Z"
  }
}
