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 centrado en el sistema de archivos para bóvedas de Obsidian, con una capa LLM-Wiki encima.

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


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 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.


Por qué kObsidian

  • Centrado en el sistema de archivos. Opera directamente sobre tu bóveda. Obsidian no necesita estar en ejecución para 55 de las 66 herramientas.
  • 66 herramientas MCP tipadas para 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 4 anotaciones MCP (readOnlyHint, destructiveHint, idempotentHint, openWorldHint).
  • Multi-bóveda vault.* (v0.3.0). El LLM puede vault.list tus bóvedas de Obsidian conocidas (descubiertas desde el propio registro de Obsidian o las 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 greppable, 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 de origen y autenticación bearer opcional — todo según la especificación del 2025-11-25.
  • 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 artefacto 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 centradas 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 entorno una vez por cliente y cada espacio de nombres de herramientas se activa; deja la clave REST en blanco y las herramientas centradas 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. Predeterminado https://127.0.0.1:27124.
OBSIDIAN_API_VERIFY_TLSOpcional. Predeterminado a 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 el llavero de tu 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 Codeclaude 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 y la URL / clave de API opcional. Cada artefacto 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 de nivel superior servers.

Gemini CLIgemini 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"
      }
    }
  }
}
Zedsettings.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"
      }
    }
  }
}
OpenCodeopencode.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 Droiddroid 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 la API REST Local, para que el modo híbrido funcione de inmediato.

Desde el código fuente (contribuciones / desarrollo)

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

Plugins de Obsidian

kObsidian es centrado en el sistema de archivos — 55 de las 66 herramientas funcionan contra 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 → buscar → InstalarActivar.

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 de 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 simple 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 / consultas / 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.* offlineSolo una ruta de bóveda. 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 con puente REST simplemente devuelven un error claro si el plugin no es accesible, y las herramientas centradas en el sistema de archivos siguen funcionando.


Inicio rápido

Antes de la primera sesión — kObsidian funciona en una bóveda de Obsidian básica, pero habilitar algunos plugins de Obsidian desbloquea toda la superficie 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 centradas en el sistema de archivos.

Una vez instalado, una sesión típica comienza con tres indicaciones en lenguaje natural. Las herramientas wiki.* más 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

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


Casos de uso de ejemplo

Las mismas primitivas cubren varios estilos reales de base de conocimiento. Tres ejemplos trabajados 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 una base de código

Modela cada ADR como una Fuente, los patrones arquitectónicos como Conceptos y los servicios / equipos / librerías como Entidades. La wiki se convierte en tu archivo de ADR con enlaces cruzados que nunca tendrás 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 base de código (documentos de diseño + post-mortems + RFC)

Los equipos de ingeniería abandonan las wikis porque nadie las actualiza. Deja que el LLM lo haga. Ingiera documentos de diseño, RFC y post-mortems 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 de la bóveda por una alucinación del LLM sobre qué servicios afecta una decisión.
  • El formato de registro greppable (## [YYYY-MM-DD] ingest | ADR-004 …) convierte a grep '^## \[' wiki/log.md | tail -20 en una consulta válida de "¿qué decidió el equipo recientemente?".
  • wiki.lint detecta 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 completo de módulos 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 del gist de Andrej Karpathy: una base de conocimiento persistente y compuesta que el LLM mantiene. La bóveda se convierte en un Memex privado y curado (Vannevar Bush, 1945) donde las referencias cruzadas, el registro de actividad y el lint son trabajo del LLM, mientras tú te centras en curar fuentes y hacer preguntas.

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

Distribución predeterminada dentro de la bóveda:

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), añade 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 — así las alucinaciones del LLM aparecen como ediciones revisables en lugar de corrupción silenciosa de la bóveda.

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 enlaces simbólicos a ~/.claude/skills/ — ver skills/README.md.


Superficie de herramientas

66 herramientas MCP en 16 espacios de nombres (v0.2.5 consolidado de ~90 a 62; v0.3.0 añadió el espacio de nombres vault.* para soporte multi-bóveda — ver CHANGELOG para el historial completo). Inventario siempre actualizado en docs/tool-inventory.json.

Espacio de nombresCantidadDestacados
vault.*4list · current · select · reset — descubrimiento multi-bóveda y cambio de sesión (v0.3.0)
notes.*8read (contenido/metadatos/estadísticas vía include) · create (nota o carpeta) · edit (reemplazar/añadir/preponer/después-de-título/después-de-bloque) · frontmatter · delete · move · list · search
tags.*4modify (añadir/quitar/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 del plugin Tasks (📅 ⏳ 🛫 ✅ 🔼 🔁) — buscar · crear · alternar · updateMetadata · stats
dataview.*7query + envoltorios 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 (añadir/mover/alternar)
canvas.*4create · parse · connections · edit (add-node/add-edge/remove-node)
templates.*2list · use (motor × acción)
workspace.*5Puente de UI de Obsidian en vivo (requiere el 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 preguntan con más firmeza)6
idempotentHint: true (seguro de reintentar)12
openWorldHint: true (alcanza fuera de la bóveda)16

Recursos MCP (direccionables por URI; cualquier cliente puede navegarlos sin llamadas a 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_PATHRequerida. Ruta absoluta a la bóveda.
OBSIDIAN_API_URLhttps://127.0.0.1:27124Base de la API REST Local de Obsidian; solo para workspace.* / commands.* / dataview.query*.
OBSIDIAN_API_VERIFY_TLSfalseEstablece true si has confiado en el certificado autofirmado de la API REST.
OBSIDIAN_REST_API_KEYClave Bearer para el plugin de la API REST (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_TOKENBearer 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 la wiki dentro de la bóveda.
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 del archivo del catálogo de la wiki.
KOBSIDIAN_WIKI_LOG_FILElog.mdNombre del archivo de registro de la wiki.
KOBSIDIAN_WIKI_SCHEMA_FILEwiki-schema.mdNombre del archivo del esquema semilla.
KOBSIDIAN_WIKI_STALE_DAYS180Umbral de página obsoleta de wiki.lint.

Cada herramienta de la wiki también acepta una anulación wikiRoot por llamada.


Documentación

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

architecture.mdPila, 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 base de código — de principio a fin
tools.mdTabla de espacios de nombres, anotaciones, recursos, prompts
SECURITY.mdOrigin/CORS, escaneos de VirusTotal, higiene de entorno
TESTING.mdComandos bun run … y cobertura
ENVIRONMENT.mdCada variable de entorno con sus valores predeterminados
MIGRATION.mdNotas de actualización

Hoja de ruta

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

  • v0.4 — Puente Obsidian LiveSync. Acceso gratuito a la bóveda con cifrado de extremo a extremo mediante el plugin comunitario Self-Hosted LiveSync (CouchDB / S3 / R2 / WebRTC peer) — para que un cliente MCP pueda alcanzar la misma bóveda de Obsidian desde cualquier máquina del usuario, sin necesidad de que Obsidian esté activo.
  • v0.5 — Verificación semántica cruzada de bóvedas. Una herramienta wiki.crossCheck que concilia dos o más bóvedas emparejadas con LiveSync en la capa de la wiki, controlada por un nuevo campo de frontmatter schema_version que utiliza la disciplina semver del proyecto como contrato de compatibilidad.

TODO.md lleva 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 artefacto de release .mcpb se escanea con VirusTotal. El flujo de trabajo Release sube cada paquete kobsidian-<platform>.mcpb a VirusTotal mediante crazy-max/ghaction-virustotal@v4 justo después de publicarse el release, y luego añade los enlaces de análisis al cuerpo del release. Cualquier usuario que instale desde un release de GitHub puede hacer clic al informe público de VirusTotal del paquete de su plataforma antes de ejecutarlo — sin necesidad de confiar en el mantenedor.

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

  • Suelo SDK fijado. @modelcontextprotocol/sdk@^1.26.0 — mitiga GHSA-345p-7cg4-v4c7 (fuga de respuesta entre clientes) y CVE-2026-0621 (ReDoS de UriTemplate). Este repositorio fija 1.29.0.

  • Trusted Publishing de npm. No se almacena ningún NPM_TOKEN de larga duración en el repositorio. GitHub Actions acuña 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 con alcance para 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 con vínculo criptográfico 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 reclamación de audiencia OIDC no coincidirá.

Notas completas en docs/SECURITY.md.


Notas de compatibilidad

  • Versión del protocolo2025-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 soportadas devuelven 400.
  • División de Dataview — las herramientas sin conexión indexan bloques de frontmatter / en línea / 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/edición que conserva el código fuente; el renderizado es responsabilidad del cliente.
  • Nivel mínimo de SDK@modelcontextprotocol/sdk@^1.26.0 (mitiga la fuga de respuestas entre clientes GHSA-345p-7cg4-v4c7 + ReDoS de UriTemplate CVE-2026-0621). Este repositorio fija 1.29.0.

Créditos

Licencia

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