second-brain-mcp
second-brain-mcp
Un servidor MCP de solo lectura para cualquier bóveda de Obsidian o markdown plano, con el protocolo de recuperación aplicado por el servidor en lugar de solicitarse en prosa.
Apunta a una carpeta de notas markdown y cualquier cliente MCP (Claude Code, Claude Desktop, Cursor, lo que sea) puede consultar esa base de conocimiento a través de cuatro herramientas reguladas. El servidor es físicamente incapaz de escribir, no puede salir del directorio de la bóveda y corta la sesión tras un presupuesto estricto de lecturas de páginas.
Por qué
Las bases de conocimiento personales acaban soldadas a una sola herramienta. Las notas viven en Obsidian; el asistente de IA que podría usarlas vive en otro sitio, así que terminas copiando y pegando. Y cuando un asistente consigue acceso a los archivos, «lee solo lo que necesites» es una petición de cortesía, no una regla.
Este servidor resuelve ambas:
Un conector, todas las aplicaciones. MCP es el USB-C de las herramientas de IA: escribe el conector de la bóveda una vez y cualquier cliente MCP puede usarlo.
El protocolo es ley, no una sugerencia. La recuperación de índice primero, un presupuesto estricto de lecturas, el acceso de solo lectura y un sandbox de rutas se aplican en el código. Las únicas operaciones que existen son las reguladas.
Related MCP server: obsidian-gate
Instalación
Requiere Node.js 18 o superior.
Opción A - desde npm
claude mcp add second-brain -- npx -y @nanthansr/second-brain-mcp /abs/path/to/your/vaultEse único comando registra el servidor en Claude Code; npx descarga y ejecuta el paquete automáticamente. Para otros clientes, consulta los bloques de configuración más abajo.
Opción B - desde el código fuente
git clone https://github.com/nanthansr/second-brain-mcp
cd second-brain-mcp
npm install && npm run build
npm test # 15-check integration suite - should end with SMOKE PASS
claude mcp add second-brain -- node /abs/path/to/second-brain-mcp/dist/index.js /abs/path/to/your/vaultClaude Desktop
Añádelo a claude_desktop_config.json (Settings → Developer → Edit Config):
{
"mcpServers": {
"second-brain": {
"command": "npx",
"args": ["-y", "@nanthansr/second-brain-mcp", "/abs/path/to/your/vault"]
}
}
}Cursor
Añade el mismo bloque a ~/.cursor/mcp.json (o Cursor Settings → MCP → Add new server).
¿No tienes una bóveda a mano?
Omite por completo el argumento de la bóveda y el servidor usará su bóveda de demostración ficticia incluida («Alex Rivera»): útil para probarlo en 30 segundos.
claude mcp add second-brain-demo -- npx -y @nanthansr/second-brain-mcpApuntar a tu bóveda de Obsidian
Tu bóveda es simplemente una carpeta: la que elegiste cuando Obsidian dijo «Open folder as vault». Pasa la ruta absoluta de esa carpeta como argumento:
SO | Ejemplo |
Windows |
|
macOS / Linux |
|
Notas:
Un
index.mden la raíz de la bóveda desbloquea el flujo de índice primero (get_index): una página de catálogo con una línea por nota. Si no tienes uno, todo sigue funcionando: el modelo recurre asearch_notes.La configuración propia de Obsidian (
.obsidian/) y cualquier otra carpeta de punto son invisibles para el servidor.El servidor nunca modifica nada: Obsidian puede permanecer abierto mientras se ejecuta.
Uso
Una vez conectado, solo haz preguntas. Flujos típicos (de una sesión real contra la bóveda de demostración):
«¿En qué está trabajando Alex Rivera y quién es Sam?» →
get_index→read_note×3 (cada una con la marcaread 1/5,read 2/5,read 3/5) → respuesta citada.
«¿Qué ha cambiado en mi bóveda esta semana?» →
list_recent(days: 7)→ lista con fechas, de la más reciente a la más antigua.
«¿Dónde guardo mis notas sobre precios?» →
search_notes(query: "pricing")→ páginas coincidentes con fragmentos con números de línea, sin gastar presupuesto.
Los clientes que admiten prompts de MCP también reciben vault-retrieval: una plantilla de comando de barra que fija el modelo al protocolo de índice primero para una pregunta determinada.
Lo que recibe el cliente
Tipo | Nombre | Qué hace | Presupuesto |
tool |
| Devuelve | no consume |
tool |
| Búsqueda que no distingue mayúsculas y minúsculas; devuelve páginas + fragmentos con números de línea | no consume |
tool |
| Contenido completo de una página por ruta relativa a la bóveda | consume |
tool |
| Páginas modificadas en los últimos N días, de la más reciente a la más antigua | no consume |
resource |
| El índice como recurso de MCP | no consume |
prompt |
| El protocolo de índice primero como plantilla de prompt reutilizable | - |
El flujo previsto refleja cómo una persona cuidadosa usa una wiki: lee el catálogo, abre las una o dos páginas que importan y responde con citas. Localizar es barato; leer consume presupuesto.
Configuración
Ajuste | Cómo | Por defecto |
Ruta de la bóveda | primer argumento de CLI, o la variable de entorno | bóveda |
Presupuesto de lectura de páginas | variable | 5 por sesión |
Modelo de seguridad
Solo lectura por construcción. No existe ninguna herramienta de escritura, edición o borrado en el código.
Sandbox de rutas. Cada ruta se canonicaliza primero con
path.resolvey luego se compara con la raíz de la bóveda: los intentos de path traversal (../…) se rechazan. Solo se pueden leer archivos.md.Presupuesto de páginas estricto. Tras N llamadas a
read_note(5 por defecto), el servidor rechaza más lecturas y le dice al modelo que sintetice a partir de lo que ya tiene. Las lecturas fallidas no consumen presupuesto.Límites de tamaño. Las notas se truncan en 50KB; los resultados de búsqueda y las listas de recientes tienen un límite.
Carpetas de punto omitidas.
.obsidian,.gity otras carpetas de punto son invisibles.El código es público, los datos no. El repositorio contiene solo el código del servidor y una bóveda de demostración ficticia. Tu bóveda real es la carpeta que montes en tiempo de ejecución; nunca sale de tu máquina.
Preguntas frecuentes
¿Salen mis datos de mi máquina? No. El servidor se ejecuta localmente como proceso hijo de tu cliente MCP y lee archivos del disco. No contiene código de red.
¿Puede modificar o eliminar mis notas? No. No existe ninguna herramienta que escriba. Es una propiedad del código, no un ajuste.
¿Qué ocurre cuando el modelo agota el presupuesto? La sexta lectura devuelve un error que le dice al modelo que sintetice a partir de las páginas que ya tiene. Una conversación nuea recibe un presupuesto renoado.
¿Por qué la respuesta de demostración hablaba de «Alex Rivera»? Estás en la bóveda de demostración ficticia incluida. Pasa la ruta de tu propia bóveda como primer argumento.
Desarrollo
npm run build # tsc -> dist/
npm test # build + 15-check smoke test (spawns the real server over stdio)La prueba de humo usa el cliente propio del SDK contra el servidor compilado: protocolo real, sin mocks. Verifica las cuatro herramientas, el recurso, el prompt, el rechazo de path traversal y que el presupuesto de lectura rechaza la lectura N+1. La CI la ejecuta en Linux y Windows, con Node 20 y 22.
¿Te preguntas por qué está construido así? Consulta docs/design-notes.md: transportes, los tres primitivos de MCP, esquemas como prompts, y las decisiones sobre sandbox y presupuesto.
Hoja de ruta
Variante remota (streamable HTTP) para que la bóveda sea accesible desde clientes alojados, con autenticación
Alcance opcional por carpeta (servir solo
wiki/, ocultarjournal/)
Contribuir
Se aceptan issues y PRs. Mantén los invariantes: sin herramientas de escritura, sin llamadas de red, y que la prueba de humo siga en verde y sin debilitarse.
Licencia
MIT · Cambios en CHANGELOG.md
Available Tools
4 toolsget_indexGet the vault indexA
Returns index.md, the catalog of every page in the vault (one line each). ALWAYS call this first to locate relevant pages, then read only the 1-2 pages that matter. Does not count against the page budget.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the output behavior (one line per page) and adds a meaningful operational trait: 'Does not count against the page budget,' which is beyond what the schema or title conveys. It could mention side-effect-free/read-only nature, but the context strongly implies a safe read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences deliver the core purpose, usage directive, and budget behavior in order of importance. No filler or redundant restating of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description fully covers what the agent needs: what it returns, how to use it first, and why it is safe to invoke. There are no missing details that would prevent a correct call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema coverage is 100%, so there are no parameter semantics to document. The description adds useful meaning about the returned content, which is more than necessary for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Returns') and resource ('index.md'), and precisely defines the output as 'the catalog of every page in the vault (one line each).' This clearly differentiates it from the sibling tools like search_notes or read_note.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly directs the agent to 'ALWAYS call this first' and then 'read only the 1-2 pages that matter,' giving a clear workflow. It does not explicitly name search_notes or list_recent as alternatives, but the sequential guidance is strong enough to establish when this tool should be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_recentList recently updated pagesA
Lists pages modified in the last N days (default 7), newest first. Good for 'what changed lately'. Does not count against the page budget.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Look-back window in days (default 7) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does disclose useful behavioral traits: a default look-back window, newest-first ordering, and that it does not consume page budget. It does not describe the returned page format or any limits beyond the schema, but for a simple read-only list tool this is solid transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences carry the core behavior, the primary use case, and a key operational constraint with no filler. The most important information is front-loaded, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one fully documented optional parameter and no output schema, the description covers the essential behaviors: what is listed, the time window, ordering, and budget impact. It could be more complete by describing what fields/details appear in the returned page list, but it is sufficient for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'days' parameter is already documented with type, range, and default. The description only repeats the default window, adding no new semantic meaning beyond what the schema already provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Lists') and resource ('pages'), with a defined time window and sort order ('last N days (default 7), newest first'). It does not explicitly name or differentiate itself from sibling tools like search_notes or get_index, but the 'recently modified' framing makes its distinct purpose reasonably clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context with 'Good for what changed lately' and adds a practical benefit ('Does not count against the page budget'). However, it does not mention when not to use it or point to alternative sibling tools, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_noteRead one pageA
Returns the full content of one markdown page by vault-relative path (e.g. wiki/people/sam-okafor.md). Counts against the hard page budget of 5 reads per session - locate pages via get_index or search_notes first, then read only what matters.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path to a .md file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discloses a key non-obvious behavior: the hard page budget of 5 reads per session. It also clarifies that the tool returns full content. It could additionally mention error behavior for missing paths or confirm it is a pure read, but it is already meaningfully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The first sentence establishes the core function and path format; the second adds the budget constraint and recommended preceding workflow. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with no output schema, the description is complete: it states what is returned, how to address the resource, and a critical usage constraint. It also routes the agent to the right discovery tools before reading.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value with a concrete path example ('wiki/people/sam-okafor.md') and reinforces the vault-relative .md semantics, making the expected input format clearer to the agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Returns the full content') and a precise resource ('one markdown page by vault-relative path'). With the title 'Read one page' and sibling tools like search_notes and list_recent, it is immediately distinguishable as a targeted read operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent to locate pages via get_index or search_notes first and to 'read only what matters', plus it warns about the hard 5-read budget. It does not explicitly mention list_recent or state when not to use this tool, so it falls just short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_notesSearch the vaultA
Case-insensitive text search across every markdown page. Returns matching pages with line-numbered snippets. Use when the index does not answer 'where does this live'. Does not count against the page budget.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Text to search for (literal, not regex) | |
| max_results | No | Max pages to return (default 10, cap 30) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It discloses case-insensitive matching, global scope, snippet return format, and the useful operational fact that it does not count against the page budget. It does not explicitly state read-only behavior, but this is strongly implied by 'search'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each carrying distinct value: the core behavior, the return format, and the usage trigger plus budget note. It is front-loaded and free of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter search tool with no output schema, the description covers scope, matching behavior, return shape, and when to use it. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already fully documented. The description adds context about case-insensitivity and scope but does not materially extend what the schema provides for query and max_results.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('search') and resource ('every markdown page'), with concrete details like case-insensitivity and line-numbered snippets. It is clearly distinct from sibling tools like get_index, read_note, and list_recent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use it 'when the index does not answer where does this live', giving a clear trigger condition. It does not enumerate exclusions or compare against read_note/list_recent, but the context is unambiguous enough for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.1.0- First observed
get_index - First observed
list_recent - First observed
read_note - First observed
search_notes
TDQS
Scored across 4 tools
Each tool has a clearly distinct role: index for catalog lookup, search for text search, read for content retrieval, and list_recent for recency. The descriptions even specify when to prefer one over another, removing ambiguity.
All tool names use snake_case with an imperative verb first, creating a predictable pattern. list_recent is slightly less parallel than list_recent_notes, but the deviation is minor and does not confuse the set.
Four tools is well-scoped for a retrieval-focused note vault: discovery via index/search/recent and content access via read. Each tool serves a distinct workflow step with no redundancy.
The surface fully covers read-oriented workflows: locating notes, finding content by text, checking recent changes, and reading full pages. The only notable gap is write/edit operations, but the tool descriptions consistently frame this as a read-only vault interface.
Maintenance
Related MCP Connectors
Search and reason over your Obsidian-style Markdown vault, right from ChatGPT.
Search, read, and safely update Markdown notes in your connected Phasoric knowledge vaults.
Agent-native notes, tasks, dev-docs, vaults, sync & handoffs. MCP + OpenAPI dual surface.
- GraniteOAuthmd.granite
Encrypted Markdown notes and team knowledge base. Search, read and write notes in vaults you allow.
Related MCP Servers
- AlicenseAqualityDmaintenanceProvides read-only access to an Obsidian vault, enabling file listing, content reading, and text search across notes via MCP.42Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to read, search, write, and link notes in an Obsidian vault via MCP tools and resources.MIT
- AlicenseNot gradedqualityBmaintenanceEnables MCP clients to search, read, and list notes and tags in a Markdown vault using read-only tools.MIT
- FlicenseNot gradedqualityCmaintenanceEnables MCP clients to search, read, list, and append to markdown notes in a local Obsidian vault or folder of .md files.-