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.
Instalación · Inicio rápido · Arquitectura · LLM Wiki · Herramientas · Documentación
🧰 El único MCP de Obsidian con espacios de trabajo.
vault.list/vault.selectpermiten 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 deOBSIDIAN_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
structuredContenty el conjunto completo de anotaciones MCP de 4 pistas (readOnlyHint,destructiveHint,idempotentHint,openWorldHint). vault.*multi-bóveda (v0.3.0). El LLM puedevault.listtus bóvedas de Obsidian conocidas (descubiertas desde el registro propio de Obsidian o variables de entornoOBSIDIAN_VAULT_<NAME>) yvault.selectentre ellas durante la sesión. Totalmente compatible con versiones anteriores:OBSIDIAN_VAULT_PATHsigue siendo el valor predeterminado y los argumentosvaultPathpor 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 contratoproposedEditspara 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.mcpbmultiplataforma para arrastrar y soltar en Claude Desktop, unsmithery.yamlpara Smithery y unserver.jsonpara el Registro MCP. Cada recurso de la versión.mcpbse 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 entorno | Necesaria para |
|---|---|
OBSIDIAN_VAULT_PATH | Requerida en todas partes. Ruta absoluta a la bóveda. |
OBSIDIAN_API_URL | URL base del plugin Local REST API. Valor predeterminado https://127.0.0.1:27124. |
OBSIDIAN_API_VERIFY_TLS | Opcional. 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_KEY | Clave 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:
- Abre tu bóveda en Obsidian.
- Configuración (⚙️, abajo a la izquierda) → Plugins de la comunidad.
- Haz clic en Activar plugins de la comunidad.
- 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 offlinedataview.fields.*/dataview.index/blocks.*funcionan sin él)templates.useconengine: "templater"
Configuración después de la instalación:
- Activa el plugin.
- Abre su configuración — desplázate hasta API key → haz clic en Copiar (o Restablecer primero si quieres una nueva).
- Pega esa clave como
OBSIDIAN_REST_API_KEYen el bloqueenv:de la configuración de tu cliente MCP. El valor predeterminadoOBSIDIAN_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
| Plugin | Enlace | Qué desbloquea |
|---|---|---|
| Dataview | id=dataview | Todas 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. |
| Templater | id=templater-obsidian | Renderizado 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. |
| Marp | id=marp-slides | Las 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. |
| Kanban | id=obsidian-kanban | Las 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. |
| Tasks | id=obsidian-tasks-plugin | Las 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ón | Solo 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
proposedEditssignifica 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 quegrep '^## \[' wiki/log.md | tail -20sea una consulta válida de "¿qué decidió el equipo recientemente?". wiki.lintrevela 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.
| Namespace | Cantidad | Destacados |
|---|---|---|
vault.* | 4 | list · current · select · reset — descubrimiento multi-vault y cambio de sesión (v0.3.0) |
notes.* | 8 | read (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.* | 4 | modify (agregar/eliminar/reemplazar/fusionar) · search · analyze · list |
links.* | 8 | Backlinks · salientes · rotos · huérfanos · hubs · grafo · salud · conexiones |
stats.* | 1 | stats.vault (estadísticas por nota movidas a notes.read) |
tasks.* | 5 | Formato de plugin Tasks (📅 ⏳ 🛫 ✅ 🔼 🔁) — buscar · crear · alternar · actualizarMetadatos · estadísticas |
dataview.* | 7 | query + wrappers de azúcar (listByTag/listByFolder/table) · index · fields.read · fields.write |
blocks.* | 3 | API unificada de bloques delimitados (list/read/update) en dataview, dataviewjs, mermaid |
marp.* | 2 | read (deck/slides/slide) · update (slide/frontmatter) |
kanban.* | 3 | parse · stats · card (agregar/mover/alternar) |
canvas.* | 4 | create · parse · connections · edit (agregar-nodo/agregar-arista/eliminar-nodo) |
templates.* | 2 | list · use (motor × acción) |
workspace.* | 5 | Puente de UI de Obsidian en vivo (requiere plugin Local REST API) |
commands.* | 2 | list (con consulta opcional) · execute |
wiki.* | 7 | init · ingest · log · indexRebuild · query · lint · summaryMerge |
system.* | 1 | version |
Anotaciones de seguridad para clientes (MCP 2025-11-25):
| Indicación | Herramientas |
|---|---|
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 entorno | Predeterminado | Propósito |
|---|---|---|
OBSIDIAN_VAULT_PATH | — | Requerida. Ruta absoluta al vault. |
OBSIDIAN_API_URL | https://127.0.0.1:27124 | Base de Local REST API de Obsidian; solo para workspace.* / commands.* / dataview.query*. |
OBSIDIAN_API_VERIFY_TLS | false | Establece 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_HOST | 127.0.0.1 | Host de enlace para dev:http. |
KOBSIDIAN_HTTP_PORT | 3000 | Puerto de enlace para dev:http. |
KOBSIDIAN_HTTP_BEARER_TOKEN | — | Bearer opcional para el transporte Streamable HTTP. |
KOBSIDIAN_ALLOWED_ORIGINS | http://localhost,http://127.0.0.1 | Lista de permitidos CORS separada por comas. |
KOBSIDIAN_WIKI_ROOT | wiki | Directorio de wiki dentro del vault. |
KOBSIDIAN_WIKI_SOURCES_DIR | Sources | Páginas de resumen por fuente. |
KOBSIDIAN_WIKI_CONCEPTS_DIR | Concepts | Páginas de temas / ideas. |
KOBSIDIAN_WIKI_ENTITIES_DIR | Entities | Personas / lugares / organizaciones / obras. |
KOBSIDIAN_WIKI_INDEX_FILE | index.md | Nombre de archivo del catálogo de wiki. |
KOBSIDIAN_WIKI_LOG_FILE | log.md | Nombre de archivo del registro de wiki. |
KOBSIDIAN_WIKI_SCHEMA_FILE | wiki-schema.md | Nombre de archivo del esquema semilla. |
KOBSIDIAN_WIKI_STALE_DAYS | 180 | Umbral de páginas obsoletas de wiki.lint. |
KOBSIDIAN_WIKI_INDEX_SOURCES_HEADING | Sources | Sección de index.md que lista fuentes; wiki.ingest archiva nuevas entradas debajo. |
KOBSIDIAN_WIKI_INDEX_CONCEPTS_HEADING | Concepts | Sección de index.md que lista conceptos. |
KOBSIDIAN_WIKI_INDEX_ENTITIES_HEADING | Entities | Sección de index.md que lista entidades. |
KOBSIDIAN_WIKI_CONCEPT_PAGE_HEADING | Discussion | Encabezado de página de concepto que recibe citas de wiki.ingest / secciones de wiki.summaryMerge. |
KOBSIDIAN_WIKI_ENTITY_PAGE_HEADING | Notable Facts | Encabezado de página de entidad que recibe citas de wiki.ingest / secciones de wiki.summaryMerge. |
KOBSIDIAN_VAULT_CONFIG_FILE | .kobsidian.json | Ruta 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.md | Stack, mapa de módulos, reglas de capas |
| wiki.md | Contrato LLM-Wiki, bucle, frontmatter, categorías de lint |
| examples.md | Wiki de investigación personal · ADR de ingeniería · wiki de código base — de principio a fin |
| tools.md | Tabla de namespaces, anotaciones, recursos, prompts |
| SECURITY.md | Origin/CORS, escaneos de VirusTotal, higiene de entorno |
| TESTING.md | Comandos bun run … + cobertura |
| ENVIRONMENT.md | Cada variable de entorno con valores predeterminados |
| MIGRATION.md | Notas 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.crossCheckque reconcilia dos o más vaults emparejados con LiveSync en la capa de wiki, controlada por un nuevo campo de frontmatterschema_versionque usa la disciplina semver del proyecto como contrato de compatibilidad.TODO.mdexplica 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
.mcpbse escanea con VirusTotal. El flujo de trabajo deReleasesube cada paquete dekobsidian-<platform>.mcpba VirusTotal mediantecrazy-max/ghaction-virustotal@v4justo 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
Origincontra una lista de permitidos (403 en caso de discrepancia), implementa preflight CORS (OPTIONS /mcp→ 204 +Access-Control-*), requiere o usa por defectoMCP-Protocol-Version, y admite autenticación bearer opcional medianteKOBSIDIAN_HTTP_BEARER_TOKEN. stdio no tiene superficie de red. -
Versión mínima fijada del SDK.
@modelcontextprotocol/sdk@^1.26.0— mitigaGHSA-345p-7cg4-v4c7(fuga de respuestas entre clientes) yCVE-2026-0621(ReDoS de UriTemplate). Este repositorio fija1.30.0. -
Publicación confiable de npm. No se almacena ningún
NPM_TOKENde 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.ymlen el repositoriobezata/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 sinMCP-Protocol-Versionrecurren a2025-03-26segú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 /
dataviewdelimitados /dataviewjsdelimitados. 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 deGHSA-345p-7cg4-v4c7+ el ReDoS de UriTemplate deCVE-2026-0621). Este repositorio fija1.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.