obsidian-local-rest-api
API REST local con MCP
Dale a tus scripts, extensiones de navegador y agentes de IA una línea directa hacia tu bóveda de Obsidian mediante una API REST segura y autenticada.
Documentación interactiva de la API: https://coddingtonbear.github.io/obsidian-local-rest-api/
Página de la comunidad de Obsidian: https://community.obsidian.md/plugins/obsidian-local-rest-api/
Lo que puedes hacer
Accede a tu bóveda a través de la API REST o del servidor MCP integrado — ambas interfaces exponen las mismas capacidades principales, de modo que los scripts, las extensiones de navegador y los agentes de IA hablan el mismo idioma.
Leer, crear, actualizar o eliminar notas — CRUD completo sobre cualquier archivo de tu bóveda, incluidos los archivos binarios
Parchear secciones específicas quirúrgicamente — apunta a un encabezado, una referencia de bloque o una clave de frontmatter y añade, antepone, reemplaza, elimina o mueve solo esa sección sin tocar el resto del archivo
Buscar en tu bóveda — búsqueda simple de texto completo o consultas estructuradas con JsonLogic sobre los metadatos de las notas (frontmatter, etiquetas, ruta, contenido)
Acceder al archivo activo — lee o escribe la nota que esté abierta actualmente en Obsidian
Listar y ejecutar comandos — dispara cualquier comando de Obsidian como si hubieras usado la paleta de comandos
Consultar etiquetas — lista todas las etiquetas de tu bóveda con recuentos de uso
Abrir archivos en Obsidian — dile a Obsidian que abra una nota específica en su interfaz
Extender la API — otros plugins pueden registrar sus propias rutas mediante la interfaz de extensión de la API
Todas las solicitudes se sirven a través de HTTPS con un certificado autofirmado y están protegidas por autenticación mediante clave de API.
Related MCP server: Connect MCP
Inicio rápido
Después de instalar y habilitar el plugin, abre Configuración → Local REST API para encontrar tu clave de API y tu certificado.
API REST
# Check the server is running (no auth required)
curl -k https://127.0.0.1:27124/
# List files at the root of your vault
curl -k -H "Authorization: Bearer <your-api-key>" \
https://127.0.0.1:27124/vault/
# Read a note
curl -k -H "Authorization: Bearer <your-api-key>" \
https://127.0.0.1:27124/vault/path/to/note.md
# Read a specific heading (URL-embedded target)
curl -k -H "Authorization: Bearer <your-api-key>" \
https://127.0.0.1:27124/vault/path/to/note.md/heading/My%20Section
# Append a line to a specific heading (PATCH with a JSON instruction)
curl -k -X PATCH \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type: application/json" \
--data '{"targetType":"heading","target":["My Section"],"operation":"append","content":"New line of content"}' \
https://127.0.0.1:27124/vault/path/to/note.mdPara evitar advertencias de certificado, puedes descargar y confiar en el certificado desde https://127.0.0.1:27124/obsidian-local-rest-api.crt, o apuntar tu cliente HTTP directamente a él.
Clientes MCP
El servidor MCP se ejecuta en https://127.0.0.1:27124/mcp/ y requiere que proporciones tu token de portador para la autenticación mediante una cabecera Authorization (es decir, Authorization: Bearer <tu-clave-de-api>). Debido a que el plugin usa un certificado autofirmado, es posible que necesites confiar en el certificado en tu sistema operativo/cliente, o usar el endpoint HTTP simple en http://127.0.0.1:27123/mcp/ (actívalo en Configuración → Local REST API → Habilitar servidor HTTP).
Claude Code
Claude Code tiene soporte nativo para MCP HTTP. La forma más rápida de añadir el servidor es mediante la CLI:
claude mcp add --transport http obsidian https://127.0.0.1:27124/mcp/ \
--header "Authorization: Bearer <your-api-key>"O añádelo manualmente a .mcp.json en la raíz de tu proyecto (con ámbito de proyecto) o configúralo a nivel de usuario mediante claude mcp add --scope user:
{
"mcpServers": {
"obsidian": {
"type": "http",
"url": "https://127.0.0.1:27124/mcp/",
"headers": {
"Authorization": "Bearer <your-api-key>"
}
}
}
}Claude Desktop
Claude Desktop no admite de forma nativa servidores MCP HTTP remotos, pero puedes conectarlo con mcp-remote (requiere Node.js). Añade lo siguiente a claude_desktop_config.json:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"obsidian": {
"command": "npx",
"args": [
"mcp-remote@latest",
"https://127.0.0.1:27124/mcp/",
"--header",
"Authorization: Bearer <your-api-key>"
]
}
}
}Reinicia Claude Desktop después de guardar el archivo.
Cursor
Cursor admite el transporte MCP HTTP Streamable. Añade lo siguiente a ~/.cursor/mcp.json (global) o .cursor/mcp.json (específico del proyecto):
{
"mcpServers": {
"obsidian": {
"url": "https://127.0.0.1:27124/mcp/",
"headers": {
"Authorization": "Bearer <your-api-key>"
}
}
}
}Otros clientes
Cualquier cliente MCP que admita el transporte HTTP Streamable puede conectarse a https://127.0.0.1:27124/mcp/ con una cabecera Authorization: Bearer <tu-clave-de-api>. Consulta la documentación de tu cliente para conocer el formato de configuración exacto.
Resumen de la API
Endpoint | Métodos | Descripción |
| GET PUT PATCH POST DELETE | Lee, escribe o elimina cualquier archivo de tu bóveda |
| GET PUT PATCH POST DELETE | Opera sobre el archivo abierto actualmente |
| POST | Búsqueda de texto completo en todas las notas |
| POST | Búsqueda estructurada mediante JsonLogic |
| GET | Lista los comandos de Obsidian disponibles |
| POST | Ejecuta un comando |
| GET | Lista todas las etiquetas con recuentos de uso |
| POST | Abre un archivo en la interfaz de Obsidian |
| GET | Estado del servidor y comprobación de autenticación |
| GET POST | Servidor MCP (Model Context Protocol) — conecta agentes de IA directamente a tu bóveda |
Para obtener detalles completos de solicitudes y respuestas, consulta la documentación interactiva.
Notas sobre parcheo
El método PATCH es una de las funciones más útiles de esta API. Te permite hacer ediciones específicas sin reescribir archivos completos.
Envía una instrucción JSON: una operación (replace, prepend, append o delete) aplicada a un ámbito (content, marker, markerAndContent o parent) de un objetivo — un encabezado (direccionado como una matriz de textos de encabezado desde el nivel superior hacia abajo), una referencia de bloque o una clave de frontmatter. La carga útil viaja en content (una cadena), value (JSON, para valores de frontmatter) o destination (un movimiento de encabezado):
# Replace the value of a frontmatter field
curl -k -X PATCH \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type: application/json" \
--data '{"targetType":"frontmatter","target":"status","operation":"replace","value":"done"}' \
https://127.0.0.1:27124/vault/path/to/note.mdLos niveles de encabezado dentro de una cadena content son relativos al objetivo (un # inicial se convierte en un hijo directo). Las advertencias (por ejemplo, un encabezado reajustado más allá del nivel 6) se devuelven como JSON codificado en porcentaje en la cabecera de respuesta Markdown-Patch-Warnings — decodifica con decodeURIComponent antes de analizarlo. Pasa ifMatch (la version de un mapa de documento) para concurrencia optimista.
Nota: El espacio en blanco es propiedad de la biblioteca — tu contenido se reduce a una forma canónica recortada (las líneas en blanco iniciales y finales no tienen significado), y la propia API suministra la línea en blanco dondequiera que el contenido insertado se enfrente al texto del cuerpo, de modo que un
appendoprependsiempre aterriza como su propio bloque y nunca se fusiona con un párrafo existente. Las líneas de encabezado, las líneas en blanco existentes y el estilo de espaciado de cada documento se conservan tal cual. Consulta la documentación interactiva para ver ejemplos prácticos.
Para continuar un bloque existente en lugar de comenzar uno nuevo — por ejemplo, extender una lista — añade within a una instrucción de encabezado: un índice que selecciona uno de los bloques de cuerpo de nivel superior de la sección (basado en 0 en orden de documento, negativo contando desde el final, de modo que -1 es el último bloque). Una edición con within se empalma literalmente, por lo que tú controlas la unión:
# Add an item to the last list under "Log" (the leading \n continues the block)
curl -k -X PATCH \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type: application/json" \
--data '{"targetType":"heading","target":["Log"],"within":-1,"operation":"append","content":"\n- new item"}' \
https://127.0.0.1:27124/vault/path/to/note.mdCon el ámbito markerAndContent, prepend/append insertan en su lugar un bloque nuevo junto al bloque indexado. Los índices son posicionales, así que lee primero el mapa de documento y combina la edición con ifMatch.
Modo de contenido sin procesar
Si tu cliente plantea markdown en el cuerpo de la solicitud (Shortcuts, Tasker, curl desde una plantilla), escapar ese contenido en JSON dentro de una instrucción es frágil. El modo de contenido sin procesar mueve los campos de la instrucción fuera del cuerpo — el objetivo en la URL (o en las cabeceras Target-Type/Target con un Markdown-Patch-Version: 2 explícito), la operación y las opciones en cabeceras — y el cuerpo es la carga útil sin procesar, sin necesidad de escape JSON:
# Append a templated line under a heading — no JSON escaping anywhere
curl -k -X PATCH \
-H "Authorization: Bearer <your-api-key>" \
-H "Operation: append" \
-H "Content-Type: text/markdown" \
--data "- $TEMPLATED_CONTENT" \
https://127.0.0.1:27124/vault/notes/daily.md/heading/LogUn cuerpo text/* es el portador de content, un cuerpo application/json es el portador de value, y ningún cuerpo no lleva nada (un delete, o un movimiento mediante una cabecera Destination). Las cabeceras Target-Scope, Within (el índice within de la instrucción como entero simple, p. ej. -1), Create-Target-If-Missing, Reject-If-Content-Preexists e If-Match completan la instrucción. Consulta la documentación interactiva para conocer las codificaciones de cabecera y todos los detalles.
¿Ya usas el formato PATCH anterior basado en cabeceras? Distribuía la instrucción en cabeceras de solicitud en lugar de un cuerpo JSON, y está obsoleto y se eliminará en 6.0. Aún funciona — envía
Markdown-Patch-Version: 1para volver a usarlo (la misma cabecera también selecciona el mapa de documento heredado unido con::en GET), y las respuestas servidas por él llevan una cabeceraDeprecation: true; sunset-version="6.0". Para actualizar, elimina esa cabecera y mueve cada cabecera al cuerpo JSON; la documentación interactiva tiene la tabla de mapeo campo por campo.
Consulta la documentación interactiva para conocer el esquema completo de instrucciones y las opciones.
Apuntar a secciones específicas
Puedes leer o escribir una parte específica de una nota — un encabezado, una referencia de bloque o un campo de frontmatter — sin obtener ni reemplazar todo el archivo. Esto funciona en solicitudes GET, PUT, POST y PATCH (para PATCH esto es modo de contenido sin procesar — añade una cabecera Operation).
Añade /<tipo-de-objetivo>/<objetivo> después del nombre del archivo. Cada nivel de encabezado anidado es su propio segmento de ruta, de modo que un encabezado cuyo texto contenga :: no necesita escape:
# Read the content under a specific heading
curl -k -H "Authorization: Bearer <your-api-key>" \
https://127.0.0.1:27124/vault/path/to/note.md/heading/My%20Section
# Read a nested heading (one path segment per level)
curl -k -H "Authorization: Bearer <your-api-key>" \
https://127.0.0.1:27124/vault/path/to/note.md/heading/Work/Meetings
# Read a frontmatter field
curl -k -H "Authorization: Bearer <your-api-key>" \
https://127.0.0.1:27124/vault/path/to/note.md/frontmatter/status
# Replace the content of a heading via PUT (heading levels are normalized for you)
curl -k -X PUT \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type: text/markdown" \
--data "Updated content" \
https://127.0.0.1:27124/vault/path/to/note.md/heading/My%20Section
# Append to a heading via POST
curl -k -X POST \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type: text/markdown" \
--data "Appended content" \
https://127.0.0.1:27124/vault/path/to/note.md/heading/My%20SectionTipos de objetivo admitidos: heading, block, frontmatter.
En un GET, una cabecera Target-Scope selecciona qué parte del objetivo se devuelve, reflejando los ámbitos de PATCH: content (el predeterminado), marker (la etiqueta — el texto sin procesar de un encabezado, el id simple de un bloque, una clave de frontmatter) o markerAndContent (todo el nodo, exactamente en la forma que consume un replace de PATCH en ese ámbito — un subárbol de encabezado se lee de vuelta con su propia línea como # Título, niveles relativos a su padre):
# Read a whole section — heading line included — ready to edit and write back
curl -k -H "Authorization: Bearer <your-api-key>" \
-H "Target-Scope: markerAndContent" \
https://127.0.0.1:27124/vault/path/to/note.md/heading/My%20SectionObsoleto: direccionamiento basado en cabeceras. Las versiones anteriores apuntaban a una sección con las cabeceras
Target-Type,TargetyTarget-Delimiter(además deTarget-Scope/Trim-Target-Whitespace). Esa forma está obsoleta y se eliminará en 6.0; solo se procesa si también envíasMarkdown-Patch-Version: 1(las respuestas llevan entonces una cabeceraDeprecation). Sin ella, proporcionar esas cabeceras de direccionamiento se rechaza con400. Proporcionar tanto el direccionamiento por ruta de URL como el formulario de cabecera en una sola solicitud devuelve422 Unprocessable Entity.
Búsqueda
POST /search/simple/?query=tus+términos ejecuta la búsqueda difusa integrada de Obsidian y devuelve nombres de archivo coincidentes con fragmentos de contexto puntuados.
POST /search/ acepta una expresión JsonLogic (tipo de contenido application/vnd.olrapi.jsonlogic+json) y la evalúa contra los metadatos de cada nota (frontmatter, etiquetas, ruta, contenido).
MCP (Model Context Protocol)
[!NOTE] Existen varios servidores MCP de terceros para Obsidian, pero ya no son necesarios: este plugin incluye un servidor MCP integrado que se ejecuta dentro de Obsidian y tiene acceso directo a los metadatos en vivo de tu bóveda, al archivo activo y a la paleta de comandos. Si actualmente usas un servidor de terceros, cambiar a este probablemente te dará mejores resultados.
El plugin incluye un servidor MCP integrado en /mcp/ para que los agentes de IA y los clientes compatibles con MCP puedan interactuar con tu bóveda sin tener que crear solicitudes HTTP manualmente.
Transporte: Streamable HTTP — se requiere autenticación con clave API.
Revisiones de protocolo
El endpoint sirve la revisión 2026-07-28 más las revisiones con sesión desde 2024-10-07 hasta 2025-11-25, eligiendo por solicitud, de modo que los clientes de cualquiera de ellas pueden compartirlo.
La revisión 2026-07-28 no tiene estado: no hay protocolo de inicio initialize ni sesión, por lo que el plugin no emite ni lee la cabecera Mcp-Session-Id. Cada solicitud lleva su propia versión de protocolo e identidad de cliente en params._meta, los repite en las cabeceras MCP-Protocol-Version, Mcp-Method y Mcp-Name, y se responde por sí sola. Los clientes pueden llamar a server/discover para conocer de antemano las revisiones y capacidades admitidas.
Los clientes que comienzan con una solicitud initialize reciben la revisión con sesión que negocian: el protocolo de inicio devuelve un Mcp-Session-Id, GET /mcp/ abre el flujo de notificaciones de esa sesión y DELETE /mcp/ la finaliza. Las sesiones existen solo en esta ruta, y son lo que mantiene honestas las capacidades listChanged del protocolo de inicio: cuando otro plugin registra o elimina una herramienta MCP, se notifica a cada sesión activa, mientras que los clientes 2026-07-28 se enteran a través de un flujo subscriptions/listen.
Conexión de un cliente
Conecta tu cliente MCP a https://127.0.0.1:27124/mcp/. La autenticación utiliza un token de portador: encuentra tu clave API en Configuración → Local REST API y pásala como:
Authorization: Bearer <your-api-key>La sintaxis de configuración exacta varía según el cliente; consulta los ejemplos de Inicio rápido anteriores o la documentación de tu cliente para servidores MCP remotos con Streamable HTTP.
[!WARNING] Para conectarte al servidor MCP de forma segura, tu cliente debe confiar en el certificado autofirmado del plugin. Puedes descargarlo y confiar en él desde
https://127.0.0.1:27124/obsidian-local-rest-api.crt, o configurar tu cliente para omitir la verificación TLS para127.0.0.1.Si no es posible confiar en un certificado autofirmado en tu entorno, puedes conectarte de forma insegura usando
http://127.0.0.1:27123/mcp/en lugar dehttps://127.0.0.1:27124/mcp/si has habilitado el endpoint HTTP en Configuración → Local REST API → Habilitar servidor HTTP.
Herramientas disponibles
Tool | Description |
| Lista archivos y subdirectorios dentro de un directorio de la bóveda |
| Lee el contenido, el frontmatter, las etiquetas y el estado de un archivo |
| Crea o sobrescribe un archivo de la bóveda |
| Añade contenido al final de un archivo de la bóveda |
| Parchea un encabezado, una referencia de bloque o un campo de frontmatter específicos |
| Elimina un archivo de la bóveda (se mueve a la papelera por defecto) |
| Mueve (renombra) un archivo de la bóveda a una nueva ruta |
| Copia un archivo de la bóveda a una nueva ruta |
| Lista los encabezados, las referencias de bloque y los campos de frontmatter de un archivo |
| Devuelve la ruta en la bóveda del archivo actualmente abierto en Obsidian |
| Busca usando una consulta JsonLogic contra los metadatos de las notas |
| Búsqueda de texto completo usando la búsqueda integrada de Obsidian |
| Lista todas las etiquetas de la bóveda con recuentos de uso |
| Lista todos los comandos de Obsidian registrados |
| Ejecuta un comando de Obsidian por ID |
| Abre un archivo en la interfaz de Obsidian |
Recursos disponibles
URI | Description |
| Especificación OpenAPI completa para esta API REST |
Extensiones de API
Otros plugins pueden registrar sus propias rutas autenticadas, rutas públicas y herramientas MCP en el servidor de este plugin. Consulta Añadir tus propias rutas de API mediante una extensión para ver un tutorial.
API de extensión tipada
Instala este paquete como dependencia de desarrollo para obtener getAPI y los tipos de todo lo que devuelve:
npm install --save-dev obsidian-local-rest-apiEste paquete declara obsidian, zod y @types/express como dependencias entre pares, porque sus tipos se refieren a los tres: addRoute devuelve el IRoute de express, y addMcpTool acepta esquemas de zod. npm instala las dependencias entre pares por ti; si las fijas tú mismo, mantenlas resolubles. Sin ellas, TypeScript amplía silenciosamente esas posiciones a any en lugar de informar de un error, por lo que un proyecto que suprime el diagnóstico de tipos faltantes no recibe ninguna advertencia de que ha perdido la comprobación de tipos exactamente donde más importa.
import { getAPI, type LocalRestApiPublicApi } from "obsidian-local-rest-api";
const api: LocalRestApiPublicApi | undefined = getAPI(this.app, this.manifest, 2);El punto de entrada del paquete es un pequeño módulo independiente: resuelve el plugin anfitrión en ejecución desde el registro de plugins de Obsidian en lugar de incluir el paquete del plugin en tu compilación. Pasar una versión de API de extensión (2 arriba) hace que getAPI lance ApiVersionUnsupportedError cuando el anfitrión instalado es más antiguo que la superficie que necesitas; omítelo para aceptar lo que esté instalado y detectar características tú mismo. getAPI devuelve undefined cuando el plugin no está instalado o aún no se ha cargado.
publicApi.d.ts se genera a partir de src/publicApi.ts, contra el cual se verifica la implementación en tiempo de compilación, por lo que los tipos publicados no pueden desviarse de lo que el plugin realmente ofrece.
Extensiones conocidas
Periodic Notes: Añade soporte para notas periódicas
Contribuciones
Consulta CONTRIBUTING.md. Si quieres añadir funcionalidad sin modificar el núcleo, considera crear una extensión de API en su lugar: las extensiones se pueden desarrollar y publicar de forma independiente.
Créditos
Inspirado por el plugin advanced-uri de Vinzent03, con el objetivo de ampliar las opciones de automatización más allá de las limitaciones de los esquemas de URL personalizados.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
No tool schema history has been recorded yet.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
An MCP server that gives your AI access to the source code and docs of all public github repos
Google Keep-style notes app with an MCP server for AI agents to read/write notes.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA local MCP server that wraps the Obsidian CLI to give AI assistants direct access to read, edit, and manage notes within an Obsidian vault. It enables advanced operations such as frontmatter property management, context-aware searching, and the execution of internal Obsidian commands.2-
- AlicenseNot gradedqualityCmaintenanceAn Obsidian plugin that runs an MCP server, enabling AI agents to read, edit, search notes, and run Dataview queries in your vault.3BSD Zero Clause
- AlicenseNot gradedqualityDmaintenanceAn MCP server that treats Obsidian vaults as knowledge graphs, enabling AI agents to traverse wikilinks, assemble token-budgeted context, and search with backlink awareness.31MIT
- AlicenseNot gradedqualityAmaintenanceAn MCP server that enables AI agents to read, search, and write to your Obsidian vault.4MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/coddingtonbear/obsidian-local-rest-api'
If you have feedback or need assistance with the MCP directory API, please join our Discord server