kObsidian

Primeiro servidor MCP de sistema de arquivos para vaults do Obsidian com uma camada LLM-Wiki sobreposta.

Documentação

kObsidian MCP

Servidor MCP com foco em filesystem para cofres Obsidian — com uma camada LLM-Wiki por cima.

Inspirado na ideia de LLM Wiki de Andrej Karpathy. Você seleciona as fontes; o LLM faz o trabalho de organização.


npm version npm downloads GitHub release license Release CI

MCP Bun TypeScript Tools Resources Prompts Smithery MCP Registry VirusTotal


Instalação · Início rápido · Arquitetura · LLM Wiki · Ferramentas · Documentação

Documentação: 简体中文 / 日本語 / 한국어

kObsidian MCP server


🧰 O único MCP Obsidian com workspaces. vault.list / vault.select permite que um LLM descubra e alterne entre seus cofres Obsidian durante a sessão — sem reiniciar, sem editar configuração, sem passar caminhos por ferramenta. Compatível com versões anteriores ao OBSIDIAN_VAULT_PATH. Adicionado na v0.3.0. Veja docs/WORKSPACES.md.


Novidades na v0.3.7

Configure cada cofre de forma independente com .kobsidian.json: personalize pastas de wiki, nomes de arquivo, cabeçalhos e o limite de páginas desatualizadas sem compartilhar uma única configuração entre todos os cofres. A inserção de cabeçalhos notes.edit também preserva o espaçamento entre parágrafos e se junta a listas existentes de forma limpa.

Exemplo de configuração e notas de atualização.

Por que kObsidian

  • Foco em filesystem. Opera diretamente no seu cofre. O Obsidian não precisa estar em execução para 55+ das 66 ferramentas.
  • 66 ferramentas MCP tipadas em cofres, notas, links, tags, tarefas, Dataview, Canvas, Kanban, blocos cercados, Marp, Templates — todas validadas com Zod, com saída structuredContent e o conjunto completo de 4 dicas de anotação MCP (readOnlyHint, destructiveHint, idempotentHint, openWorldHint).
  • vault.* multi-cofre (v0.3.0). O LLM pode vault.list seus cofres Obsidian conhecidos (descobertos pelo registro do próprio Obsidian ou pelas variáveis de ambiente OBSIDIAN_VAULT_<NAME>) e vault.select entre eles durante a sessão. Totalmente compatível com versões anteriores: OBSIDIAN_VAULT_PATH continua sendo o padrão e os argumentos vaultPath por chamada sempre vencem.
  • Orquestração LLM-Wiki — um namespace wiki.* que transforma seu cofre em uma base de conhecimento em crescimento: ingira fontes, atualize automaticamente um índice + log pesquisável, verifique órfãos / links quebrados / páginas desatualizadas. O agente aplica referências cruzadas por meio de um contrato proposedEdits para que cada escrita fique visível na transcrição.
  • Ambos os transportes. stdio clássico para clientes MCP locais e Streamable HTTP (Hono) para remoto, com preflight CORS, tratamento MCP-Protocol-Version, origem 403 e autenticação bearer opcional — tudo conforme a especificação de 2025-11-25.
  • Compatibilidade de esquema Claude Code (v0.3.5+, refinado na v0.3.6). As ferramentas anunciam JSON Schema 2020-12 tanto via stdio quanto via Streamable HTTP sem estado. Ferramentas com formato de união expõem seus campos e seletores ao cliente, enquanto o Zod ainda valida cada chamada e a saída estruturada. Veja detalhes de compatibilidade.
  • Disponível em todos os lugares. npm (npx -y kobsidian-mcp), pacotes .mcpb multiplataforma para arrastar e soltar no Claude Desktop, um smithery.yaml para Smithery e um server.json para o MCP Registry. Cada artefato de release .mcpb é verificado pelo VirusTotal, com links anexados ao corpo do release.

Instalação

Escolha seu cliente abaixo. Cada cliente suporta o modo híbrido completo — ferramentas com foco em filesystem (mais de 80 delas) funcionam apenas com o caminho do cofre, e a mesma configuração pode simultaneamente carregar a chave da API REST Local para desbloquear workspace.*, commands.* e DQL ao vivo via dataview.query*. Defina todo o bloco de variáveis de ambiente uma vez por cliente e todos os namespaces de ferramentas são ativados; deixe a chave REST em branco e as ferramentas com foco em filesystem continuam funcionando.

Variável de ambienteNecessária para
OBSIDIAN_VAULT_PATHObrigatória em todos os lugares. Caminho absoluto para o cofre.
OBSIDIAN_API_URLURL base do plugin Local REST API. Padrão https://127.0.0.1:27124.
OBSIDIAN_API_VERIFY_TLSOpcional. Padrão false (o plugin REST API usa um certificado autoassinado em 127.0.0.1). Defina true somente após confiar no certificado no chaveiro do seu sistema operacional.
OBSIDIAN_REST_API_KEYChave bearer do plugin Local REST API — apenas para workspace.* / commands.* / dataview.query* ao vivo.

Lista completa em docs/ENVIRONMENT.md. Troque npx por bunx em qualquer lugar se quiser inicialização de ≈10 ms em vez de ≈200 ms.

Claude Code — claude mcp add
claude mcp add kobsidian -s user \
  --env OBSIDIAN_VAULT_PATH=/absolute/path/to/vault \
  --env OBSIDIAN_API_URL=https://127.0.0.1:27124 \
  --env OBSIDIAN_REST_API_KEY=only-if-you-use-workspace-or-commands-tools \
  -- npx -y kobsidian-mcp

No Windows, envolva o comando em cmd /c: -- cmd /c npx -y kobsidian-mcp.

Claude Desktop — arrastar e soltar .mcpb

Baixe kobsidian-<platform>.mcpb do último release e arraste-o para o Claude Desktop. O instalador solicita o caminho do cofre + URL/chave da API opcional. Cada artefato de release é verificado pelo VirusTotal — os links estão no corpo do release.

Crie um localmente:

bun install
bun run build:compile   # → dist/kobsidian (or .exe on Windows)
bun run bundle:mcpb     # → kobsidian.mcpb
Codex CLI (OpenAI) — codex mcp add
codex mcp add kobsidian \
  --env OBSIDIAN_VAULT_PATH=/absolute/path/to/vault \
  --env OBSIDIAN_API_URL=https://127.0.0.1:27124 \
  --env OBSIDIAN_REST_API_KEY=only-if-you-use-workspace-or-commands-tools \
  -- npx -y kobsidian-mcp
Cursor — ~/.cursor/mcp.json ou deeplink

Edite ~/.cursor/mcp.json (ou o .cursor/mcp.json por projeto):

{
  "mcpServers": {
    "kobsidian": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "kobsidian-mcp"],
      "env": {
        "OBSIDIAN_VAULT_PATH": "/absolute/path/to/vault",
        "OBSIDIAN_API_URL": "https://127.0.0.1:27124",
        "OBSIDIAN_REST_API_KEY": "only-if-you-use-workspace-or-commands-tools"
      }
    }
  }
}

Ou entregue um deeplink de um clique aos seus usuários: cursor://anysphere.cursor-deeplink/mcp/install?name=kobsidian&config=<base64-encoded-config>.

VS Code (Copilot) — code --add-mcp
code --add-mcp '{"name":"kobsidian","command":"npx","args":["-y","kobsidian-mcp"],"env":{"OBSIDIAN_VAULT_PATH":"/absolute/path/to/vault","OBSIDIAN_API_URL":"https://127.0.0.1:27124","OBSIDIAN_REST_API_KEY":"only-if-you-use-workspace-or-commands-tools"}}'

Ou crie .vscode/mcp.json no seu workspace com o mesmo formato sob uma chave de nível superior servers.

Gemini CLI — gemini mcp add
gemini mcp add kobsidian \
  --env OBSIDIAN_VAULT_PATH=/absolute/path/to/vault \
  --env OBSIDIAN_API_URL=https://127.0.0.1:27124 \
  --env OBSIDIAN_REST_API_KEY=only-if-you-use-workspace-or-commands-tools \
  -- npx -y kobsidian-mcp

Ou edite manualmente ~/.gemini/settings.json sob mcpServers.

Antigravity (Google) — mcp_config.json

Edite ~/.gemini/antigravity/mcp_config.json (Windows: %USERPROFILE%\.gemini\antigravity\mcp_config.json):

{
  "mcpServers": {
    "kobsidian": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "kobsidian-mcp"],
      "env": {
        "OBSIDIAN_VAULT_PATH": "/absolute/path/to/vault",
        "OBSIDIAN_API_URL": "https://127.0.0.1:27124",
        "OBSIDIAN_REST_API_KEY": "only-if-you-use-workspace-or-commands-tools"
      }
    }
  }
}
Zed — settings.json sob context_servers

Em ~/.config/zed/settings.json:

{
  "context_servers": {
    "kobsidian": {
      "source": "custom",
      "command": "npx",
      "args": ["-y", "kobsidian-mcp"],
      "env": {
        "OBSIDIAN_VAULT_PATH": "/absolute/path/to/vault",
        "OBSIDIAN_API_URL": "https://127.0.0.1:27124",
        "OBSIDIAN_REST_API_KEY": "only-if-you-use-workspace-or-commands-tools"
      }
    }
  }
}
OpenCode — opencode.json sob mcp
{
  "mcp": {
    "kobsidian": {
      "type": "local",
      "command": ["npx", "-y", "kobsidian-mcp"],
      "environment": {
        "OBSIDIAN_VAULT_PATH": "/absolute/path/to/vault",
        "OBSIDIAN_API_URL": "https://127.0.0.1:27124",
        "OBSIDIAN_REST_API_KEY": "only-if-you-use-workspace-or-commands-tools"
      }
    }
  }
}
Factory Droid — droid mcp add
droid mcp add kobsidian "npx -y kobsidian-mcp" \
  --env OBSIDIAN_VAULT_PATH=/absolute/path/to/vault \
  --env OBSIDIAN_API_URL=https://127.0.0.1:27124 \
  --env OBSIDIAN_REST_API_KEY=only-if-you-use-workspace-or-commands-tools
Outros clientes (Cline, JetBrains AI, Continue, hosts personalizados) — JSON mcpServers genérico

Qualquer cliente MCP que leia um objeto mcpServers padrão aceitará:

{
  "mcpServers": {
    "kobsidian": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "kobsidian-mcp"],
      "env": {
        "OBSIDIAN_VAULT_PATH": "/absolute/path/to/vault",
        "OBSIDIAN_API_URL": "https://127.0.0.1:27124",
        "OBSIDIAN_REST_API_KEY": "only-if-you-use-workspace-or-commands-tools"
      }
    }
  }
}

"type": "stdio" é opcional em clientes que inferem o transporte a partir de command (Claude Code), mas obrigatório no Claude Desktop, Cursor, VSCode e Antigravity — inclua-o para máxima portabilidade.

Smithery

smithery.ai renderiza uma interface de instalação diretamente de smithery.yaml e coleta as quatro variáveis de ambiente para você — caminho do cofre mais o trio opcional de URL / TLS / chave bearer da API REST Local, para que o modo híbrido funcione imediatamente.

A partir do código-fonte (contribuindo / desenvolvendo)

git clone https://github.com/bezata/kObsidian
cd kObsidian
bun install
bun run dev:stdio    # or dev:http

Plugins do Obsidian

O kObsidian é focado em filesystem — 55+ das 66 ferramentas funcionam em um diretório de cofre simples, sem plugins do Obsidian instalados. Os plugins abaixo só importam se você quiser os namespaces de ferramentas específicos que dependem deles.

Habilitando plugins da comunidade (uma vez, se ainda não estiverem ativados)

O Obsidian vem com plugins da comunidade desabilitados por padrão. Habilite-os uma vez por cofre:

  1. Abra seu cofre no Obsidian.
  2. Configurações (⚙️, canto inferior esquerdo) → Plugins da comunidade.
  3. Clique em Ativar plugins da comunidade.
  4. Navegar → pesquisar → Instalar → Ativar.

Necessários para as ferramentas com ponte REST

Obsidian Local REST API (por Adam Coddington) — necessário para:

  • workspace.* (activeFile, openFile, navigate, closeActiveFile, toggleEditMode)
  • commands.* (execute, list)
  • dataview.query / dataview.listByTag / dataview.listByFolder / dataview.table (DQL em tempo de execução — as ferramentas offline dataview.fields.* / dataview.index / blocks.* funcionam sem ele)
  • templates.use com engine: "templater"

Configuração após a instalação:

  1. Ative o plugin.
  2. Abra as configurações dele — role até API key → clique em Copiar (ou Redefinir primeiro se quiser uma nova).
  3. Cole essa chave como OBSIDIAN_REST_API_KEY no bloco env: da configuração do seu cliente MCP. O padrão OBSIDIAN_API_URL (https://127.0.0.1:27124) funciona imediatamente.

Deixe o plugin em execução enquanto usa as ferramentas com ponte REST — o endpoint é somente local (127.0.0.1), então nada sai da sua máquina.

Melhora (mas não é necessário para) namespaces de ferramentas específicos

PluginLinkO que ele desbloqueia
Dataviewid=dataviewTodas as ferramentas dataview.* ainda funcionam no markdown bruto; o plugin Dataview é o que faz as consultas DQL em dataview.query* realmente executarem. Também renderiza seus campos e consultas visualmente dentro do Obsidian.
Templaterid=templater-obsidianRenderização de templates em tempo de execução via API REST (templates.use com engine:"templater"). O mecanismo offline de filesystem (templates.use com engine:"filesystem") e templates.list funcionam sem ele.
Marpid=marp-slidesAs ferramentas Marp marp.* analisam e editam markdown com front-matter Marp mesmo sem o plugin; o plugin é o que renderiza slides / exporta para PDF dentro do Obsidian.
Kanbanid=obsidian-kanbanAs ferramentas kanban.* leem/escrevem o formato de quadro em markdown simples independentemente do plugin; o plugin é o que renderiza o quadro como colunas arrastáveis dentro do Obsidian.
Tasksid=obsidian-tasks-pluginAs ferramentas tasks.* entendem a sintaxe de emojis do plugin Tasks (📅 ⏳ 🛫 ✅ 🔼 🔁) independentemente do plugin; o plugin é o que fornece filtragem / consulta / alternância dentro do Obsidian.

Os links obsidian://show-plugin?id=… saltam direto para o plugin no navegador integrado do Obsidian — clique em um com o Obsidian aberto e ele faz deep-link para a tela de instalação.

Resumo

Você quer …Mínimo necessário
Usar notes.* / tags.* / links.* / stats.vault / tasks.* / wiki.* / kanban.* / blocks.* / marp.* / canvas.* / templates.list + templates.use (engine:"filesystem") / offline dataview.*Apenas um caminho de vault. Nenhum plugin necessário.
Usar workspace.* / commands.*+ Plugin Local REST API + variável de ambiente da chave de API
Executar consultas DQL ao vivo (dataview.query / dataview.listBy* / dataview.table)+ Local REST API + Dataview
Executar modelos Templater em tempo de execução+ Local REST API + Templater

Nenhuma combinação de plugins faz o kObsidian depender do Obsidian estar em execução — as ferramentas com ponte REST apenas retornam um erro claro se o plugin não estiver acessível, e as ferramentas baseadas em sistema de arquivos continuam funcionando.


Início rápido

Antes da primeira sessão — o kObsidian funciona em um vault Obsidian básico, mas habilitar alguns plugins do Obsidian desbloqueia toda a superfície de ferramentas. Veja Plugins do Obsidian abaixo para a configuração de 5 minutos (Local REST API, Dataview, Templater, Marp, Kanban, Tasks). Pule se você só precisa das 80+ ferramentas baseadas em sistema de arquivos.

Uma vez instalado, uma sessão típica começa com três prompts em linguagem natural. As ferramentas wiki.* + as habilidades .claude cuidam do resto.

You:  "Set up a wiki in this vault."
LLM:  wiki.init  →  wiki/{Sources,Concepts,Entities}/ + index.md + log.md + wiki-schema.md

You:  "Ingest this: https://… (paper on Memex)"
LLM:  wiki.ingest  →  creates wiki/Sources/as-we-may-think.md + log entry
      returns proposedEdits:
        - insertAfterHeading  index.md#Sources
        - createStub          Concepts/memex.md
        - createStub          Entities/vannevar-bush.md
      LLM applies each via notes.*  (you see every write in the transcript)

You:  "What does the wiki say about memex vs hypertext?"
LLM:  wiki.query memex  →  top-ranked pages
      notes.read on each  →  cited synthesis
      offers to file the synthesis back via wiki.summaryMerge

You:  "Audit the wiki."
LLM:  wiki.lint  →  {orphans, brokenLinks, stale, missingPages, tagSingletons, indexMismatch}
      proposes concrete fixes; applies after you confirm

Loop completo, contratos de frontmatter e o design proposedEdits em docs/wiki.md.


Exemplos de casos de uso

As mesmas primitivas cobrem vários tipos reais de base de conhecimento. Três exemplos práticos abaixo; tutoriais mais longos em docs/examples.md.

A. Wiki de pesquisa pessoal

You: "Ingest this paper on in-context learning: <url or pasted markdown>"
LLM:  wiki.ingest title="In-Context Learning — A Survey" sourceType=paper
        tags=[icl, prompting] relatedConcepts=[In-Context Learning, Few-Shot Prompting]
        relatedEntities=[Brown 2020]
      → wiki/Sources/in-context-learning-a-survey.md
      → proposedEdits:
          • createStub  wiki/Concepts/in-context-learning.md
          • createStub  wiki/Concepts/few-shot-prompting.md
          • createStub  wiki/Entities/brown-2020.md
          • insertAfterHeading  wiki/index.md#Sources
      LLM applies each via notes.create / notes.edit (mode: "after-heading").

B. Registros de Decisão de Arquitetura (ADRs) para um código-base

Modele cada ADR como uma Fonte, padrões arquiteturais como Conceitos, e serviços / equipes / bibliotecas como Entidades. A wiki se torna seu arquivo de ADRs com links cruzados que você nunca precisa manter manualmente.

You: "Record ADR-004: we're switching internal service comms from REST
      to gRPC. Context: <paste>"
LLM:  wiki.ingest title="ADR-004 — gRPC for internal service comms"
        sourceType=note tags=[adr, architecture, rpc]
        relatedConcepts=[gRPC, Service Mesh, Internal RPC]
        relatedEntities=[order-service, payment-service, inventory-service]
      → wiki/Sources/adr-004-grpc-for-internal-service-comms.md
      → proposedEdits:
          • createStub   wiki/Concepts/grpc.md
          • createStub   wiki/Concepts/service-mesh.md
          • insertAfterHeading  wiki/Entities/order-service.md#Notable Facts
          • insertAfterHeading  wiki/Entities/payment-service.md#Notable Facts
          • …

Three weeks later —
You: "Why did we pick gRPC for internal comms?"
LLM:  wiki.query "grpc internal comms"
      notes.read top matches
      → "Per [[wiki/Sources/adr-004-grpc-for-internal-service-comms.md|ADR-004]],
         chosen over REST because of native streaming + typed schemas; tradeoff
         accepted: browser clients still use REST via an edge gateway
         ([[wiki/Concepts/service-mesh.md]])."

C. Wiki de código-base (documentos de design + post-mortems + RFCs)

Equipes de engenharia abandonam wikis porque ninguém as atualiza. Deixe o LLM fazer isso. Ingira documentos de design, RFCs e post-mortems como Fontes; padrões arquiteturais se tornam Conceitos; serviços e equipes se tornam Entidades.

You: "We had an incident today — payment-service timeouts cascaded
      into order-service. Here's the post-mortem: <paste>"
LLM:  wiki.ingest title="Postmortem 2026-04-10 — Payment timeouts cascade"
        sourceType=other tags=[postmortem, incident, reliability]
        relatedConcepts=[Circuit Breaker, Cascade Failure, Timeout Budget]
        relatedEntities=[payment-service, order-service]
      → wiki/Sources/postmortem-2026-04-10-payment-timeouts-cascade.md
      → proposedEdits:
          • createStub  wiki/Concepts/circuit-breaker.md
          • createStub  wiki/Concepts/cascade-failure.md
          • insertAfterHeading  wiki/Entities/payment-service.md#Notable Facts
          • insertAfterHeading  wiki/Entities/order-service.md#Notable Facts

Periodic housekeeping —
You: "Audit the codebase wiki."
LLM:  wiki.lint
      → 3 orphan RFCs (unlinked from any Concept; link or archive?)
      → 1 broken link: [[wiki/Entities/legacy-auth-service.md]]
        (deprecated in Q1; remove the link from
         [[wiki/Sources/adr-002-session-migration.md]]?)
      → 4 post-mortems past the 180-day stale threshold — tag with
        "needs-review" or re-ingest with updated lessons-learned?
      → 2 tag singletons: `retry-logic` (merge into `retry-policy`?),
        `observability` (first use; keep).

Por que isso funciona para equipes de engenharia

  • O contrato proposedEdits significa que cada escrita de referência cruzada é visível na transcrição — sem corrupção silenciosa do vault por uma alucinação do LLM sobre quais serviços uma decisão afeta.
  • O formato de log pesquisável (## [YYYY-MM-DD] ingest | ADR-004 …) torna grep '^## \[' wiki/log.md | tail -20 uma consulta válida de "o que a equipe decidiu recentemente".
  • wiki.lint revela links quebrados para serviços que foram descontinuados há meses — a contabilidade que humanos nunca conseguem fazer.

Arquitetura

┌──────────────────────────────────────────────────────────────────────┐
│                           MCP Clients                                │
│   Claude Code · Claude Desktop · Cursor · VSCode · Antigravity · Zed │
│   JetBrains AI · Cline · Continue · ChatGPT · Smithery · …           │
└────────────────────────────┬─────────────────────────────────────────┘
                             │ JSON-RPC 2.0 · MCP 2025-11-25
         ┌───────────────────┴──────────────────────┐
         ▼                                          ▼
┌──────────────────┐                   ┌─────────────────────────┐
│ stdio transport  │                   │ Streamable HTTP (Hono)  │
│                  │                   │ + OPTIONS / CORS        │
│                  │                   │ + MCP-Protocol-Version  │
│                  │                   │ + Origin 403 / bearer   │
└────────┬─────────┘                   └────────┬────────────────┘
         │                                      │
         └──────────────────┬───────────────────┘
                            ▼
          ┌──────────────────────────────────┐
          │          McpServer               │
          │  ┌────────────┐ ┌─────────────┐  │
          │  │  90 Tools  │ │ 4 Resources │  │
          │  └────────────┘ └─────────────┘  │
          │  ┌────────────┐ ┌─────────────┐  │
          │  │ 3 Prompts  │ │ structured  │  │
          │  │            │ │   content   │  │
          │  └────────────┘ └─────────────┘  │
          └────────────┬─────────────────────┘
                       │
                       ▼
          ┌──────────────────────────────────┐
          │      Domain layer (pure)         │
          │  notes · links · tags · tasks    │
          │  dataview · canvas · kanban      │
          │  blocks · marp · templates       │
          │  wiki/ orchestration             │
          └──────┬─────────────────┬─────────┘
                 │                 │
                 ▼                 ▼
         ┌──────────────┐   ┌──────────────────────┐
         │  vault/ (FS) │   │ Obsidian Local REST  │
         │ authoritative│   │ API plugin (optional)│
         └──────────────┘   └──────────────────────┘

Mapa completo de módulos em docs/architecture.md.


LLM Wiki (60 segundos)

A parte tediosa de manter uma base de conhecimento não é ler ou pensar — é a contabilidade. Humanos abandonam wikis porque o fardo de manutenção cresce mais rápido que o valor. LLMs não ficam entediados.

O kObsidian implementa o padrão LLM Wiki do gist de Andrej Karpathy: uma base de conhecimento persistente e crescente que o LLM mantém. O vault se torna um Memex privado e curado (Vannevar Bush, 1945) onde referências cruzadas, manutenção de logs e lint são tarefas do LLM enquanto você foca em curar fontes e fazer perguntas.

"Em vez de apenas recuperar de documentos brutos no momento da consulta, o LLM constrói e mantém incrementalmente uma wiki persistente — uma coleção estruturada e interligada de arquivos markdown que fica entre você e as fontes brutas." — Andrej Karpathy

              User drops a source
                      │
                      ▼
            ┌──────────────────────┐    proposedEdits
            │     wiki.ingest      │ ─────────────────────┐
            └──────────┬───────────┘                      │
                       │ creates 1 file                   ▼
                       │              ┌──────────────────────────────┐
                       ▼              │ LLM applies edits via        │
              wiki/Sources/           │  notes.edit (after-heading)  │
              <slug>.md               │  notes.edit (replace)        │
                       │              │  notes.create                │
                       │ appends      └──────────────────────────────┘
                       ▼
                 wiki/log.md

   Anytime: wiki.query   → top pages → notes.read → cited synthesis
   Periodic: wiki.lint   → orphans · broken · stale · missing · tag-drift
   Curate:   wiki.summaryMerge — add cited section to concept/entity page

Layout padrão dentro do vault:

wiki/
├── Sources/           per-source summary pages
├── Concepts/          topic / idea pages (LLM-maintained)
├── Entities/          people / places / orgs / works
├── index.md           categorized catalog (wiki.indexRebuild)
├── log.md             greppable chronological log
└── wiki-schema.md     vault-local copy of the contract

A decisão de design chave é que wiki.ingest nunca reescreve referências cruzadas cegamente. Ele cria exatamente um arquivo (a página de Fontes), anexa um arquivo (log.md) e retorna um array proposedEdits que o agente aplica com as ferramentas notes.* existentes. Cada escrita é visível na transcrição — então alucinações do LLM aparecem como edições revisáveis em vez de corrupção silenciosa do vault.

Contrato completo em docs/wiki.md.

Habilidades do Claude Code

Quatro habilidades em skills/ são acionadas por linguagem natural: wiki-bootstrap, wiki-ingest, wiki-query, wiki-lint. Copie ou crie links simbólicos para ~/.claude/skills/ — veja skills/README.md.


Superfície de ferramentas

66 ferramentas MCP em 16 namespaces (v0.2.5 consolidou de ~90 para 62; v0.3.0 adicionou o namespace vault.* para suporte a múltiplos vaults — veja CHANGELOG para o histórico completo). Inventário sempre atual em docs/tool-inventory.json.

NamespaceContagemDestaques
vault.*4list · current · select · reset — descoberta de múltiplos vaults e troca de sessão (v0.3.0)
notes.*8read (conteúdo/metadados/estatísticas via include) · create (nota ou pasta) · edit (substituir/anexar/preceder/após-cabeçalho/após-bloco) · frontmatter · delete · move · list · search
tags.*4modify (adicionar/remover/substituir/mesclar) · search · analyze · list
links.*8Backlinks · outgoing · broken · orphans · hubs · graph · health · connections
stats.*1stats.vault (estatísticas por nota movidas para notes.read)
tasks.*5Formato do plugin Tasks (📅 ⏳ 🛫 ✅ 🔼 🔁) — search · create · toggle · updateMetadata · stats
dataview.*7query + wrappers de açúcar (listByTag/listByFolder/table) · index · fields.read · fields.write
blocks.*3API unificada de blocos cercados (list/read/update) em dataview, dataviewjs, mermaid
marp.*2read (deck/slides/slide) · update (slide/frontmatter)
kanban.*3parse · stats · card (adicionar/mover/alternar)
canvas.*4create · parse · connections · edit (add-node/add-edge/remove-node)
templates.*2list · use (engine × action)
workspace.*5Ponte de UI ao vivo do Obsidian (requer plugin Local REST API)
commands.*2list (com consulta opcional) · execute
wiki.*7init · ingest · log · indexRebuild · query · lint · summaryMerge
system.*1version

Anotações de segurança do cliente (MCP 2025-11-25):

DicaFerramentas
readOnlyHint: true (clientes podem aprovar automaticamente)47
destructiveHint: true (clientes solicitam confirmação mais firme)6
idempotentHint: true (seguro tentar novamente)12
openWorldHint: true (acessa fora do vault)16

Recursos MCP (endereçáveis por URI; qualquer cliente pode navegar sem chamadas de ferramenta):

kobsidian://wiki/index              wiki/index.md
kobsidian://wiki/log                wiki/log.md
kobsidian://wiki/schema             wiki/wiki-schema.md
kobsidian://wiki/page/{+path}       any Sources/Concepts/Entities page

Prompts MCP (para clientes que não consomem os arquivos skills/): ingest-source, answer-from-wiki, health-check-wiki.

Detalhes em docs/tools.md.


Configuração

Variável de ambientePadrãoFinalidade
OBSIDIAN_VAULT_PATH—Obrigatória. Caminho absoluto para o vault.
OBSIDIAN_API_URLhttps://127.0.0.1:27124Base da Local REST API do Obsidian; apenas para workspace.* / commands.* / dataview.query*.
OBSIDIAN_API_VERIFY_TLSfalseDefina true se você confiou no certificado autoassinado da REST API.
OBSIDIAN_REST_API_KEY—Chave Bearer para o plugin REST API (se usado).
KOBSIDIAN_HTTP_HOST127.0.0.1Host de bind para dev:http.
KOBSIDIAN_HTTP_PORT3000Porta de bind para dev:http.
KOBSIDIAN_HTTP_BEARER_TOKEN—Bearer opcional para o transporte HTTP Streamable.
KOBSIDIAN_ALLOWED_ORIGINShttp://localhost,http://127.0.0.1Lista de permissões CORS separada por vírgulas.
KOBSIDIAN_WIKI_ROOTwikiDiretório da wiki dentro do vault.
KOBSIDIAN_WIKI_SOURCES_DIRSourcesPáginas de resumo por fonte.
KOBSIDIAN_WIKI_CONCEPTS_DIRConceptsPáginas de tópicos / ideias.
KOBSIDIAN_WIKI_ENTITIES_DIREntitiesPessoas / lugares / organizações / obras.
KOBSIDIAN_WIKI_INDEX_FILEindex.mdNome do arquivo do catálogo da wiki.
KOBSIDIAN_WIKI_LOG_FILElog.mdNome do arquivo de log da wiki.
KOBSIDIAN_WIKI_SCHEMA_FILEwiki-schema.mdNome do arquivo de schema inicial.
KOBSIDIAN_WIKI_STALE_DAYS180Limiar de páginas obsoletas wiki.lint.
KOBSIDIAN_WIKI_INDEX_SOURCES_HEADINGSourcesSeção index.md que lista fontes; wiki.ingest arquiva novas entradas sob ela.
KOBSIDIAN_WIKI_INDEX_CONCEPTS_HEADINGConceptsSeção index.md que lista conceitos.
KOBSIDIAN_WIKI_INDEX_ENTITIES_HEADINGEntitiesSeção index.md que lista entidades.
KOBSIDIAN_WIKI_CONCEPT_PAGE_HEADINGDiscussionCabeçalho da página de conceito que recebe citações wiki.ingest / seções wiki.summaryMerge.
KOBSIDIAN_WIKI_ENTITY_PAGE_HEADINGNotable FactsCabeçalho da página de entidade que recebe citações wiki.ingest / seções wiki.summaryMerge.
KOBSIDIAN_VAULT_CONFIG_FILE.kobsidian.jsonCaminho relativo ao vault do arquivo de configuração por vault (abaixo).

Cada ferramenta da wiki também aceita uma substituição wikiRoot por chamada, e wiki.ingest aceita substituições indexHeading / conceptHeading / entityHeading por chamada para vaults cujas páginas usam cabeçalhos localizados (ex.: ## Fontes). Quando um cabeçalho alvo está ausente em uma página, a proposta degrada para append para que ainda possa ser aplicada via notes.edit.

Arquivo de configuração por vault

Configurações que pertencem a um vault específico em vez do servidor — nomes de pastas, nomes de arquivos e cabeçalhos de seção de uma wiki localizada — vão em um .kobsidian.json na raiz do vault. Cada chave é opcional e tem precedência sobre a variável de ambiente correspondente; um argumento de ferramenta por chamada tem precedência sobre ambos (por chamada → .kobsidian.json → env → padrão).

{
  "$schema": "https://raw.githubusercontent.com/bezata/kObsidian/main/docs/kobsidian.config.schema.json",
  "wiki": {
    "root": "wiki",
    "sourcesDir": "Fontes",
    "staleDays": 90,
    "headings": {
      "indexSources": "Fontes",
      "indexConcepts": "Conceitos",
      "indexEntities": "Entidades",
      "conceptPage": "Discussão",
      "entityPage": "Fatos Notáveis"
    }
  }
}

Chaves desconhecidas e JSON malformado são rejeitados com o caminho do arquivo no erro para que erros de digitação apareçam imediatamente; vault.current retorna a configuração efetiva sob config (ou o erro).


Documentação

Documentação localizada está disponível em 简体中文, 日本語 e 한국어.

architecture.mdStack, mapa de módulos, regras de camadas
wiki.mdContrato LLM-Wiki, loop, frontmatter, categorias de lint
examples.mdWiki de pesquisa pessoal · ADRs de engenharia · wiki de código-base — ponta a ponta
tools.mdTabela de namespaces, anotações, recursos, prompts
SECURITY.mdOrigin/CORS, varreduras VirusTotal, higiene de ambiente
TESTING.mdComandos bun run … + cobertura
ENVIRONMENT.mdCada variável de ambiente com padrões
MIGRATION.mdNotas de atualização

Roadmap

Os próximos dois marcos são rastreados em TODO.md:

  • v0.4 — Ponte Obsidian LiveSync. Acesso gratuito ao vault com criptografia ponta a ponta via plugin da comunidade Self-Hosted LiveSync (CouchDB / S3 / R2 / peer WebRTC) — para que um cliente MCP possa alcançar o mesmo vault do Obsidian de qualquer máquina que o usuário possua, sem que o Obsidian esteja ativo.
  • v0.5 — Verificação de vaults com semântica cruzada. Uma ferramenta wiki.crossCheck que reconcilia dois ou mais vaults pareados via LiveSync na camada da wiki, controlada por um novo campo de frontmatter schema_version que usa a disciplina de semver do projeto como contrato de compatibilidade. TODO.md traz a motivação, a divisão de tarefas por marco e as regras de como os itens migram daí para o CHANGELOG.

Desenvolvimento

bun install
bun run typecheck
bun run lint
bun run test          # 56 tests across 14 files
bun run build         # node-target stdio.js + bun-target http.js
bun run inventory     # regenerate docs/tool-inventory.json

Convenções do projeto em AGENTS.md.


Segurança e cadeia de suprimentos

  • Cada artefato de release .mcpb é verificado pelo VirusTotal. O workflow Release envia cada pacote kobsidian-<platform>.mcpb para VirusTotal via crazy-max/ghaction-virustotal@v4 logo após a publicação do release e anexa os links de análise ao corpo do release. Qualquer usuário que instale a partir de um release do GitHub pode clicar e ver o relatório público do VirusTotal para o pacote da sua plataforma antes de executá-lo — sem necessidade de confiar no mantenedor.

  • Reforço de transporte. Streamable HTTP valida Origin contra uma lista de permissões (403 em caso de incompatibilidade), implementa preflight de CORS (OPTIONS /mcp → 204 + Access-Control-*), exige ou usa como padrão MCP-Protocol-Version e suporta autenticação bearer opcional via KOBSIDIAN_HTTP_BEARER_TOKEN. stdio não tem superfície de rede.

  • Versão mínima fixada do SDK. @modelcontextprotocol/sdk@^1.26.0 — mitiga GHSA-345p-7cg4-v4c7 (vazamento de resposta entre clientes) e CVE-2026-0621 (ReDoS do UriTemplate). Este repositório fixa 1.30.0.

  • npm Trusted Publishing. Nenhum NPM_TOKEN de longa duração é armazenado no repositório. O GitHub Actions gera um token OIDC de curta duração a cada push de tag e o CLI do npm o troca por um token de publicação único, com escopo restrito a este arquivo de workflow exato (.github/workflows/release.yml no repositório bezata/kObsidian). Atestados de proveniência são automáticos — cada versão publicada tem uma declaração de build com vínculo criptográfico apontando para a execução exata do Actions que a produziu. Forks, outros branches ou arquivos de workflow modificados não podem publicar — a declaração de audiência do OIDC não corresponderá.

Notas completas em docs/SECURITY.md.


Notas de compatibilidade

  • Versão do protocolo — 2025-11-25 (especificação MCP atual). Clientes HTTP sem MCP-Protocol-Version usam 2025-03-26 como fallback, conforme a especificação; versões explícitas, porém não suportadas, retornam 400.
  • Divisão do Dataview — ferramentas offline indexam blocos de frontmatter / inline / lista / tarefa / dataview cercado / dataviewjs cercado. O DQL em tempo de execução é delegado ao Obsidian + Dataview por meio da Local REST API. DataviewJS preserva a origem, mas não é executado dentro deste servidor.
  • Mermaid + Marp — apenas análise/edição com preservação da origem; a renderização é responsabilidade do cliente.
  • Versão mínima do SDK — @modelcontextprotocol/sdk@^1.26.0 (mitiga GHSA-345p-7cg4-v4c7 vazamento de resposta entre clientes + CVE-2026-0621 ReDoS do UriTemplate). Este repositório fixa 1.30.0.

Créditos

  • Padrão LLM Wiki — gist do Andrej Karpathy. kObsidian é uma implementação concreta, em TypeScript e centrada no sistema de arquivos, dessa ideia.
  • Memex — Vannevar Bush, As We May Think, 1945. O conceito de trilhas associativas é o que o grafo de referências cruzadas do wiki tenta ser.
  • Model Context Protocol — Anthropic + a Agentic AI Foundation.
  • Obsidian — obsidian.md. O formato do cofre é autoritativo; o kObsidian o respeita, não o migra.

Licença

MIT — veja LICENSE. Contribuições são bem-vindas; abra uma issue primeiro para qualquer coisa não trivial.