kObsidian

Primer servidor MCP basado en sistema de archivos para bóvedas de Obsidian con una capa LLM-Wiki encima.

Documentación

kObsidian MCP

Servidor MCP basado en el sistema de archivos para bóvedas de Obsidian, con una capa de LLM-Wiki encima.

Inspirado en la idea de LLM Wiki de Andrej Karpathy. Tú seleccionas las fuentes; el LLM se encarga del mantenimiento.


npm version npm downloads GitHub release license Release CI

MCP Bun TypeScript Tools Resources Prompts Smithery MCP Registry VirusTotal


Instalación · Inicio rápido · Arquitectura · LLM Wiki · Herramientas · Documentación

Documentación: 简体中文 / 日本語 / 한국어

kObsidian MCP server


🧰 El único MCP de Obsidian con espacios de trabajo. vault.list / vault.select permiten que un LLM descubra y cambie entre tus bóvedas de Obsidian durante la sesión, sin reiniciar, sin editar la configuración ni pasar rutas por cada herramienta. Compatible con versiones anteriores de OBSIDIAN_VAULT_PATH. Añadido en v0.3.0. Consulta docs/WORKSPACES.md.


Novedades en v0.3.7

Configura cada bóveda de forma independiente con .kobsidian.json: personaliza carpetas wiki, nombres de archivo, encabezados y el umbral de páginas obsoletas sin compartir una única configuración entre todas las bóvedas. La inserción de encabezados con notes.edit también conserva el espaciado entre párrafos y se integra limpiamente con listas existentes.

Ejemplo de configuración y notas de actualización.

Por qué kObsidian

  • Basado en el sistema de archivos. Opera directamente sobre tu bóveda. Obsidian no necesita estar en ejecución para más de 55 de las 66 herramientas.
  • 66 herramientas MCP tipadas en bóvedas, notas, enlaces, etiquetas, tareas, Dataview, Canvas, Kanban, bloques delimitados, Marp, Plantillas — todas validadas con Zod, con salida structuredContent y el conjunto completo de anotaciones MCP de 4 pistas (readOnlyHint, destructiveHint, idempotentHint, openWorldHint).
  • vault.* multi-bóveda (v0.3.0). El LLM puede vault.list tus bóvedas de Obsidian conocidas (descubiertas desde el registro propio de Obsidian o variables de entorno OBSIDIAN_VAULT_<NAME>) y vault.select entre ellas durante la sesión. Totalmente compatible con versiones anteriores: OBSIDIAN_VAULT_PATH sigue siendo el valor predeterminado y los argumentos vaultPath por llamada siempre tienen prioridad.
  • Orquestación LLM-Wiki — un espacio de nombres wiki.* que convierte tu bóveda en una base de conocimiento compuesta: ingiere fuentes, actualiza automáticamente un índice y un registro consultable, y verifica huérfanos / enlaces rotos / páginas obsoletas. El agente aplica referencias cruzadas mediante un contrato proposedEdits para que cada escritura sea visible en la transcripción.
  • Ambos transportes. stdio clásico para clientes MCP locales y Streamable HTTP (Hono) para remoto, con preflight CORS, manejo de MCP-Protocol-Version, 403 por origen y autenticación bearer opcional — todo según la especificación del 2025-11-25.
  • Compatibilidad con el esquema de Claude Code (v0.3.5+, refinado en v0.3.6). Las herramientas anuncian JSON Schema 2020-12 tanto por stdio como por Streamable HTTP sin estado. Las herramientas con forma de unión exponen sus campos y selectores al cliente, mientras que Zod sigue validando cada llamada y la salida estructurada. Consulta detalles de compatibilidad.
  • Disponible en todas partes. npm (npx -y kobsidian-mcp), paquetes .mcpb multiplataforma para arrastrar y soltar en Claude Desktop, un smithery.yaml para Smithery y un server.json para el Registro MCP. Cada recurso de la versión .mcpb se escanea con VirusTotal y los enlaces se añaden al cuerpo de la versión.

Instalación

Elige tu cliente a continuación. Cada cliente admite el modo híbrido completo — las herramientas basadas en el sistema de archivos (más de 80) funcionan solo con la ruta de la bóveda, y la misma configuración puede simultáneamente llevar la clave de la API REST Local para desbloquear workspace.*, commands.* y DQL en vivo mediante dataview.query*. Configura todo el bloque de variables de entorno una vez por cliente y todos los espacios de nombres de herramientas se activan; deja la clave REST en blanco y las herramientas basadas en el sistema de archivos seguirán funcionando.

Variable de entornoNecesaria para
OBSIDIAN_VAULT_PATHRequerida en todas partes. Ruta absoluta a la bóveda.
OBSIDIAN_API_URLURL base del plugin Local REST API. Valor predeterminado https://127.0.0.1:27124.
OBSIDIAN_API_VERIFY_TLSOpcional. Valor predeterminado false (el plugin REST API usa un certificado autofirmado en 127.0.0.1). Establece true solo después de confiar en el certificado en tu llavero del sistema operativo.
OBSIDIAN_REST_API_KEYClave bearer del plugin Local REST API — solo para workspace.* / commands.* / dataview.query* en vivo.

Lista completa en docs/ENVIRONMENT.md. Cambia npx por bunx en cualquier lugar si quieres un arranque en frío de ≈10 ms en lugar 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

En Windows, envuelve el comando en cmd /c: -- cmd /c npx -y kobsidian-mcp.

Claude Desktop — arrastrar y soltar .mcpb

Descarga kobsidian-<platform>.mcpb desde la última versión y arrástralo a Claude Desktop. El instalador solicita la ruta de la bóveda más la URL / clave API opcional. Cada recurso de la versión se escanea con VirusTotal — los enlaces están en el cuerpo de la versión.

Compila uno 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 o enlace profundo

Edita ~/.cursor/mcp.json (o el .cursor/mcp.json por proyecto):

{
  "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"
      }
    }
  }
}

O entrega un enlace profundo de un clic a tus usuarios: 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"}}'

O crea .vscode/mcp.json en tu espacio de trabajo con la misma forma bajo una clave servers de nivel superior.

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

O edita manualmente ~/.gemini/settings.json bajo mcpServers.

Antigravity (Google) — mcp_config.json

Edita ~/.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 bajo context_servers

En ~/.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 bajo 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
Otros clientes (Cline, JetBrains AI, Continue, hosts personalizados) — JSON mcpServers genérico

Cualquier cliente MCP que lea un objeto mcpServers estándar aceptará:

{
  "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" es opcional en clientes que infieren el transporte desde command (Claude Code), pero requerido por Claude Desktop, Cursor, VSCode y Antigravity — inclúyelo para máxima portabilidad.

Smithery

smithery.ai muestra una interfaz de instalación directamente desde smithery.yaml y recopila las cuatro variables de entorno por ti — la ruta de la bóveda más el trío opcional de URL / TLS / clave bearer de Local REST API, para que el modo híbrido funcione de inmediato.

Desde el código fuente (contribuir / desarrollo)

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

Plugins de Obsidian

kObsidian es basado en el sistema de archivos — más de 55 de las 66 herramientas funcionan con un directorio de bóveda simple sin plugins de Obsidian instalados. Los plugins a continuación solo importan si quieres los espacios de nombres de herramientas específicos que dependen de ellos.

Habilitar plugins de la comunidad (una sola vez, si aún no están activados)

Obsidian viene con los plugins de la comunidad deshabilitados por defecto. Actívalos una vez por bóveda:

  1. Abre tu bóveda en Obsidian.
  2. Configuración (⚙️, abajo a la izquierda) → Plugins de la comunidad.
  3. Haz clic en Activar plugins de la comunidad.
  4. Explorar → busca → Instalar → Activar.

Requeridos para las herramientas con puente REST

Obsidian Local REST API (por Adam Coddington) — necesario para:

  • workspace.* (activeFile, openFile, navigate, closeActiveFile, toggleEditMode)
  • commands.* (execute, list)
  • dataview.query / dataview.listByTag / dataview.listByFolder / dataview.table (DQL en tiempo de ejecución — las herramientas offline dataview.fields.* / dataview.index / blocks.* funcionan sin él)
  • templates.use con engine: "templater"

Configuración después de la instalación:

  1. Activa el plugin.
  2. Abre su configuración — desplázate hasta API key → haz clic en Copiar (o Restablecer primero si quieres una nueva).
  3. Pega esa clave como OBSIDIAN_REST_API_KEY en el bloque env: de la configuración de tu cliente MCP. El valor predeterminado OBSIDIAN_API_URL (https://127.0.0.1:27124) funciona de inmediato.

Deja el plugin en ejecución mientras uses las herramientas con puente REST — el endpoint es solo local (127.0.0.1), así que nada sale de tu máquina.

Mejora (pero no es requerido para) espacios de nombres de herramientas específicos

PluginEnlaceQué desbloquea
Dataviewid=dataviewTodas las herramientas dataview.* siguen funcionando sobre el markdown sin procesar; el plugin Dataview es lo que hace que las consultas DQL en dataview.query* realmente se ejecuten. También renderiza tus campos y consultas visualmente dentro de Obsidian.
Templaterid=templater-obsidianRenderizado de plantillas en tiempo de ejecución mediante la API REST (templates.use con engine:"templater"). El motor offline del sistema de archivos (templates.use con engine:"filesystem") y templates.list funcionan sin él.
Marpid=marp-slidesLas herramientas Marp marp.* analizan y editan markdown con front-matter de Marp incluso sin el plugin; el plugin es lo que renderiza diapositivas / exporta a PDF dentro de Obsidian.
Kanbanid=obsidian-kanbanLas herramientas kanban.* leen/escriben el formato de tablero en markdown plano independientemente del plugin; el plugin es lo que renderiza el tablero como columnas arrastrables dentro de Obsidian.
Tasksid=obsidian-tasks-pluginLas herramientas tasks.* entienden la sintaxis de emojis del plugin Tasks (📅 ⏳ 🛫 ✅ 🔼 🔁) independientemente del plugin; el plugin es lo que proporciona filtrado / consulta / alternancia dentro de Obsidian.

Los enlaces obsidian://show-plugin?id=… saltan directamente al plugin en el navegador integrado de Obsidian — haz clic en uno con Obsidian abierto y se enlazará profundamente a la pantalla de instalación.

Resumen

Quieres…Mínimo que necesitas
Usar notes.* / tags.* / links.* / stats.vault / tasks.* / wiki.* / kanban.* / blocks.* / marp.* / canvas.* / templates.list + templates.use (engine:"filesystem") / dataview.* sin conexiónSolo una ruta de vault. No se requieren plugins.
Usar workspace.* / commands.*+ Plugin Local REST API + variable de entorno de clave API
Ejecutar consultas DQL en vivo (dataview.query / dataview.listBy* / dataview.table)+ Local REST API + Dataview
Ejecutar plantillas Templater en tiempo de ejecución+ Local REST API + Templater

Ninguna combinación de plugins hace que kObsidian dependa de que Obsidian esté en ejecución: las herramientas puente REST simplemente devuelven un error claro si el plugin no es accesible, y las herramientas basadas en el sistema de archivos siguen funcionando.


Inicio rápido

Antes de la primera sesión — kObsidian funciona en un vault de Obsidian sin configurar, pero habilitar algunos plugins de Obsidian desbloquea la superficie completa de herramientas. Consulta Plugins de Obsidian a continuación para la configuración de 5 minutos (Local REST API, Dataview, Templater, Marp, Kanban, Tasks). Omítelo si solo necesitas las más de 80 herramientas basadas en el sistema de archivos.

Una vez instalado, una sesión típica comienza con tres indicaciones en lenguaje natural. Las herramientas wiki.* + las habilidades .claude se encargan del 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

Bucle completo, contratos de frontmatter y el diseño proposedEdits en docs/wiki.md.


Casos de uso de ejemplo

Las mismas primitivas cubren varios tipos de bases de conocimiento del mundo real. Tres ejemplos desarrollados a continuación; recorridos más largos en docs/examples.md.

A. Wiki de investigación personal

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 Decisiones de Arquitectura (ADR) para un código base

Modela cada ADR como una Fuente, los patrones arquitectónicos como Conceptos, y los servicios / equipos / bibliotecas como Entidades. La wiki se convierte en tu archivo de ADR con enlaces cruzados que nunca tienes que mantener a mano.

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 diseño + autopsias + RFC)

Los equipos de ingeniería abandonan las wikis porque nadie las actualiza. Deja que el LLM lo haga. Ingiere documentos de diseño, RFC y autopsias como Fuentes; los patrones arquitectónicos se convierten en Conceptos; los servicios y equipos se convierten en 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 qué esto funciona para equipos de ingeniería

  • El contrato proposedEdits significa que cada escritura de referencia cruzada es visible en la transcripción: sin corrupción silenciosa del vault por una alucinación del LLM sobre qué servicios afecta una decisión.
  • El formato de registro greppable (## [YYYY-MM-DD] ingest | ADR-004 …) hace que grep '^## \[' wiki/log.md | tail -20 sea una consulta válida de "¿qué decidió el equipo recientemente?".
  • wiki.lint revela enlaces rotos a servicios que fueron desaprobados hace meses: la contabilidad que los humanos nunca llegan a hacer.

Arquitectura

┌──────────────────────────────────────────────────────────────────────┐
│                           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 de módulos completo en docs/architecture.md.


LLM Wiki (60 segundos)

La parte tediosa de mantener una base de conocimiento no es la lectura ni el pensamiento: es la contabilidad. Los humanos abandonan las wikis porque la carga de mantenimiento crece más rápido que el valor. A los LLM no les aburre.

kObsidian implementa el patrón LLM Wiki de el gist de Andrej Karpathy: una base de conocimiento persistente y acumulativa que el LLM mantiene. El vault se convierte en un Memex privado y curado (Vannevar Bush, 1945) donde las referencias cruzadas, el mantenimiento de registros y el lint son trabajo del LLM mientras tú te enfocas en curar fuentes y hacer preguntas.

"En lugar de solo recuperar de documentos sin procesar en el momento de la consulta, el LLM construye y mantiene incrementalmente una wiki persistente: una colección estructurada e interconectada de archivos markdown que se sitúa entre tú y las fuentes sin procesar." — 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

Diseño predeterminado dentro del 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

La decisión de diseño clave es que wiki.ingest nunca reescribe referencias cruzadas a ciegas. Crea exactamente un archivo (la página de Fuentes), agrega un archivo (log.md) y devuelve un array proposedEdits que el agente aplica con las herramientas notes.* existentes. Cada escritura es visible en la transcripción, por lo que las alucinaciones del LLM aparecen como ediciones revisables en lugar de corrupción silenciosa del vault.

Contrato completo en docs/wiki.md.

Habilidades de Claude Code

Cuatro habilidades en skills/ se activan con lenguaje natural: wiki-bootstrap, wiki-ingest, wiki-query, wiki-lint. Cópialas o haz symlink en ~/.claude/skills/ — consulta skills/README.md.


Superficie de herramientas

66 herramientas MCP en 16 namespaces (v0.2.5 consolidó de ~90 a 62; v0.3.0 agregó el namespace vault.* para soporte multi-vault — consulta CHANGELOG para el historial completo). Inventario siempre actualizado en docs/tool-inventory.json.

NamespaceCantidadDestacados
vault.*4list · current · select · reset — descubrimiento multi-vault y cambio de sesión (v0.3.0)
notes.*8read (contenido/metadatos/estadísticas vía include) · create (nota o carpeta) · edit (reemplazar/agregar/preponer/después-de-encabezado/después-de-bloque) · frontmatter · delete · move · list · search
tags.*4modify (agregar/eliminar/reemplazar/fusionar) · search · analyze · list
links.*8Backlinks · salientes · rotos · huérfanos · hubs · grafo · salud · conexiones
stats.*1stats.vault (estadísticas por nota movidas a notes.read)
tasks.*5Formato de plugin Tasks (📅 ⏳ 🛫 ✅ 🔼 🔁) — buscar · crear · alternar · actualizarMetadatos · estadísticas
dataview.*7query + wrappers de azúcar (listByTag/listByFolder/table) · index · fields.read · fields.write
blocks.*3API unificada de bloques delimitados (list/read/update) en dataview, dataviewjs, mermaid
marp.*2read (deck/slides/slide) · update (slide/frontmatter)
kanban.*3parse · stats · card (agregar/mover/alternar)
canvas.*4create · parse · connections · edit (agregar-nodo/agregar-arista/eliminar-nodo)
templates.*2list · use (motor × acción)
workspace.*5Puente de UI de Obsidian en vivo (requiere plugin Local REST API)
commands.*2list (con consulta opcional) · execute
wiki.*7init · ingest · log · indexRebuild · query · lint · summaryMerge
system.*1version

Anotaciones de seguridad para clientes (MCP 2025-11-25):

IndicaciónHerramientas
readOnlyHint: true (los clientes pueden aprobar automáticamente)47
destructiveHint: true (los clientes solicitan confirmación más firme)6
idempotentHint: true (seguro de reintentar)12
openWorldHint: true (accede fuera del vault)16

Recursos MCP (direccionables por URI; cualquier cliente puede navegar sin llamadas de herramientas):

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 no consumen los archivos skills/): ingest-source, answer-from-wiki, health-check-wiki.

Detalles en docs/tools.md.


Configuración

Variable de entornoPredeterminadoPropósito
OBSIDIAN_VAULT_PATH—Requerida. Ruta absoluta al vault.
OBSIDIAN_API_URLhttps://127.0.0.1:27124Base de Local REST API de Obsidian; solo para workspace.* / commands.* / dataview.query*.
OBSIDIAN_API_VERIFY_TLSfalseEstablece true si has confiado en el certificado autofirmado de la REST API.
OBSIDIAN_REST_API_KEY—Clave Bearer para el plugin REST API (si se usa).
KOBSIDIAN_HTTP_HOST127.0.0.1Host de enlace para dev:http.
KOBSIDIAN_HTTP_PORT3000Puerto de enlace para dev:http.
KOBSIDIAN_HTTP_BEARER_TOKEN—Bearer opcional para el transporte Streamable HTTP.
KOBSIDIAN_ALLOWED_ORIGINShttp://localhost,http://127.0.0.1Lista de permitidos CORS separada por comas.
KOBSIDIAN_WIKI_ROOTwikiDirectorio de wiki dentro del vault.
KOBSIDIAN_WIKI_SOURCES_DIRSourcesPáginas de resumen por fuente.
KOBSIDIAN_WIKI_CONCEPTS_DIRConceptsPáginas de temas / ideas.
KOBSIDIAN_WIKI_ENTITIES_DIREntitiesPersonas / lugares / organizaciones / obras.
KOBSIDIAN_WIKI_INDEX_FILEindex.mdNombre de archivo del catálogo de wiki.
KOBSIDIAN_WIKI_LOG_FILElog.mdNombre de archivo del registro de wiki.
KOBSIDIAN_WIKI_SCHEMA_FILEwiki-schema.mdNombre de archivo del esquema semilla.
KOBSIDIAN_WIKI_STALE_DAYS180Umbral de páginas obsoletas de wiki.lint.
KOBSIDIAN_WIKI_INDEX_SOURCES_HEADINGSourcesSección de index.md que lista fuentes; wiki.ingest archiva nuevas entradas debajo.
KOBSIDIAN_WIKI_INDEX_CONCEPTS_HEADINGConceptsSección de index.md que lista conceptos.
KOBSIDIAN_WIKI_INDEX_ENTITIES_HEADINGEntitiesSección de index.md que lista entidades.
KOBSIDIAN_WIKI_CONCEPT_PAGE_HEADINGDiscussionEncabezado de página de concepto que recibe citas de wiki.ingest / secciones de wiki.summaryMerge.
KOBSIDIAN_WIKI_ENTITY_PAGE_HEADINGNotable FactsEncabezado de página de entidad que recibe citas de wiki.ingest / secciones de wiki.summaryMerge.
KOBSIDIAN_VAULT_CONFIG_FILE.kobsidian.jsonRuta relativa al vault del archivo de configuración por vault (abajo).

Cada herramienta de wiki también acepta una anulación wikiRoot por llamada, y wiki.ingest acepta anulaciones indexHeading / conceptHeading / entityHeading por llamada para vaults cuyas páginas usan encabezados localizados (p. ej., ## Fontes). Cuando un encabezado objetivo falta en una página, la propuesta degrada a append para que aún pueda aplicarse vía notes.edit.

Archivo de configuración por vault

Configuraciones que pertenecen a un vault en lugar de al servidor — nombres de carpetas, nombres de archivos y encabezados de sección de una wiki localizada — van en un .kobsidian.json en la raíz del vault. Cada clave es opcional y supera a la variable de entorno correspondiente; un argumento de herramienta por llamada supera a ambos (por llamada → .kobsidian.json → entorno → predeterminado).

{
  "$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"
    }
  }
}

Las claves desconocidas y el JSON malformado se rechazan con la ruta del archivo en el error para que los errores tipográficos aparezcan de inmediato; vault.current devuelve la configuración efectiva bajo config (o el error).


Documentación

La documentación localizada está disponible en 简体中文, 日本語 y 한국어.

architecture.mdStack, mapa de módulos, reglas de capas
wiki.mdContrato LLM-Wiki, bucle, frontmatter, categorías de lint
examples.mdWiki de investigación personal · ADR de ingeniería · wiki de código base — de principio a fin
tools.mdTabla de namespaces, anotaciones, recursos, prompts
SECURITY.mdOrigin/CORS, escaneos de VirusTotal, higiene de entorno
TESTING.mdComandos bun run … + cobertura
ENVIRONMENT.mdCada variable de entorno con valores predeterminados
MIGRATION.mdNotas de actualización

Hoja de ruta

Los próximos dos hitos se rastrean en TODO.md:

  • v0.4 — Puente Obsidian LiveSync. Acceso gratuito al vault con cifrado de extremo a extremo a través del plugin comunitario Self-Hosted LiveSync (CouchDB / S3 / R2 / par WebRTC) — para que un cliente MCP pueda acceder al mismo vault de Obsidian desde cualquier máquina que el usuario posea, sin que Obsidian esté activo.
  • v0.5 — Verificación de vaults entre semánticas. Una herramienta wiki.crossCheck que reconcilia dos o más vaults emparejados con LiveSync en la capa de wiki, controlada por un nuevo campo de frontmatter schema_version que usa la disciplina semver del proyecto como contrato de compatibilidad. TODO.md explica la motivación, el desglose de tareas por hito y las reglas sobre cómo los elementos pasan de allí al CHANGELOG.

Desarrollo

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

Convenciones del proyecto en AGENTS.md.


Seguridad y cadena de suministro

  • Cada activo de lanzamiento de .mcpb se escanea con VirusTotal. El flujo de trabajo de Release sube cada paquete de kobsidian-<platform>.mcpb a VirusTotal mediante crazy-max/ghaction-virustotal@v4 justo después de publicar el lanzamiento, y luego añade los enlaces de análisis al cuerpo del lanzamiento. Cualquier usuario que instale desde un lanzamiento de GitHub puede hacer clic para ver el informe público de VirusTotal del paquete de su plataforma antes de ejecutarlo — sin necesidad de confiar en el mantenedor.

  • Refuerzo del transporte. Streamable HTTP valida Origin contra una lista de permitidos (403 en caso de discrepancia), implementa preflight CORS (OPTIONS /mcp → 204 + Access-Control-*), requiere o usa por defecto MCP-Protocol-Version, y admite autenticación bearer opcional mediante KOBSIDIAN_HTTP_BEARER_TOKEN. stdio no tiene superficie de red.

  • Versión mínima fijada del SDK. @modelcontextprotocol/sdk@^1.26.0 — mitiga GHSA-345p-7cg4-v4c7 (fuga de respuestas entre clientes) y CVE-2026-0621 (ReDoS de UriTemplate). Este repositorio fija 1.30.0.

  • Publicación confiable de npm. No se almacena ningún NPM_TOKEN de larga duración en el repositorio. GitHub Actions genera un token OIDC de corta duración en cada push de etiqueta y el CLI de npm lo intercambia por un token de publicación de un solo uso limitado a este archivo de flujo de trabajo exacto (.github/workflows/release.yml en el repositorio bezata/kObsidian). Las atestaciones de procedencia son automáticas — cada versión publicada tiene una declaración de compilación vinculada criptográficamente que apunta a la ejecución exacta de Actions que la produjo. Los forks, otras ramas o archivos de flujo de trabajo modificados no pueden publicar — la afirmación de audiencia OIDC no coincidirá.

Notas completas en docs/SECURITY.md.


Notas de compatibilidad

  • Versión del protocolo — 2025-11-25 (especificación MCP actual). Los clientes HTTP sin MCP-Protocol-Version recurren a 2025-03-26 según la especificación; las versiones explícitas pero no compatibles devuelven 400.
  • División de Dataview — las herramientas sin conexión indexan bloques de frontmatter / inline / lista / tarea / dataview delimitados / dataviewjs delimitados. El DQL en tiempo de ejecución se delega a Obsidian + Dataview a través de la API REST local. DataviewJS conserva el código fuente pero no se ejecuta dentro de este servidor.
  • Mermaid + Marp — solo análisis y edición que conservan el código fuente; el renderizado es responsabilidad del cliente.
  • Versión mínima del SDK — @modelcontextprotocol/sdk@^1.26.0 (mitiga la fuga de respuestas entre clientes de GHSA-345p-7cg4-v4c7 + el ReDoS de UriTemplate de CVE-2026-0621). Este repositorio fija 1.30.0.

Créditos

  • Patrón de LLM Wiki — el gist de Andrej Karpathy. kObsidian es una implementación concreta en TypeScript, centrada en el sistema de archivos, de la idea.
  • Memex — Vannevar Bush, As We May Think, 1945. El concepto de senderos asociativos es lo que el grafo de referencias cruzadas del wiki intenta ser.
  • Model Context Protocol — Anthropic + la Agentic AI Foundation.
  • Obsidian — obsidian.md. El formato de bóveda es la autoridad; kObsidian lo respeta, no lo migra.

Licencia

MIT — ver LICENSE. Las contribuciones son bienvenidas; abre un issue primero para cualquier cosa no trivial.