Skip to main content
Glama
bborbe

Semantic Search MCP

by bborbe

Búsqueda Semántica

Búsqueda semántica sobre archivos markdown. Encuentra notas relacionadas por significado, no solo por palabras clave. Detecta duplicados antes de crear nuevas notas.

Admite dos transportes de servidor:

  • stdio MCP — Para integración con Claude Code (un proceso por sesión)

  • HTTP — MCP-sobre-HTTP + REST combinados en un solo puerto; un proceso activo compartido por todos los clientes

Características

  • Búsqueda semántica usando sentence-transformers

  • Detección de notas duplicadas/similares

  • Índice de actualización automática con monitor de archivos

  • Soporte para múltiples directorios

  • Extracción de etiquetas en línea (#tag-name)

Related MCP server: mcp-recall-md

Instalación

Instalación solo CPU — recomendado para macOS (cualquier Mac, Apple Silicon o Intel) y Linux/Windows sin una GPU NVIDIA. Ahorra ~5GB de binarios CUDA. En macOS, la GPU de Apple (MPS) se detecta y utiliza automáticamente a través del backend MPS integrado de PyTorch; la etiqueta "CPU" se refiere solo a la ausencia de CUDA, no al dispositivo de cómputo en tiempo de ejecución.

uv tool install --index https://download.pytorch.org/whl/cpu \
  git+https://github.com/bborbe/semantic-search

Instalación CUDA — solo para Linux/Windows con una GPU NVIDIA dedicada. No aplicable a macOS (NVIDIA CUDA no es compatible en Mac).

uv tool install git+https://github.com/bborbe/semantic-search

Actualización

uv tool upgrade semantic-search

Modos de Servidor

stdio MCP (Claude Code por sesión)

Genera un proceso por sesión de Claude Code. Es simple, pero cada sesión carga su propia copia del modelo de ~400 MB–1 GB.

claude mcp add -s project semantic-search \
  --env CONTENT_PATH=/path/to/vault \
  -- \
  uvx --from git+https://github.com/bborbe/semantic-search semantic-search-mcp

Herramientas disponibles:

  • search_related(query, top_k=5) — Encuentra notas semánticamente relacionadas

  • check_duplicates(file_path) — Detecta notas duplicadas/similares

HTTP (compartido entre todos los clientes)

Un único proceso de larga ejecución sirve MCP-sobre-HTTP en /mcp además de REST en /search, /duplicates, /health, /reindex. Todas las sesiones de Claude Code y clientes REST comparten un único indexador activo.

CONTENT_PATH=/path/to/vault semantic-search-http --host 127.0.0.1 --port 8321

Apunte Claude Code hacia él mediante la configuración de MCP:

{
  "mcpServers": {
    "semantic-search": {
      "type": "http",
      "url": "http://127.0.0.1:8321/mcp"
    }
  }
}

Endpoints REST:

Endpoint

Método

Descripción

/mcp

POST

MCP-sobre-HTTP (Claude Code)

/search?q=...&top_k=5

GET

Búsqueda semántica

/duplicates?file=...&threshold=0.85

GET

Encontrar notas duplicadas

/health

GET

Comprobación de estado con estadísticas del índice

/reindex

GET/POST

Forzar reconstrucción del índice

Consultas de ejemplo:

# Search
curl 'http://127.0.0.1:8321/search?q=kubernetes+deployment'

# Find duplicates
curl 'http://127.0.0.1:8321/duplicates?file=notes/my-note.md'

# Health check
curl 'http://127.0.0.1:8321/health'

Plugin de Claude Code

Este repositorio también se distribuye como un plugin del marketplace de Claude Code con comandos para configuración, búsqueda e investigación.

Instalación

claude plugin marketplace add bborbe/semantic-search
claude plugin install semantic-search

Actualización

claude plugin marketplace update semantic-search
claude plugin update semantic-search@semantic-search

Inicio rápido

# One-shot interactive setup: installs the binary, writes the launchd/systemd
# unit, registers the MCP server in your Claude config.
/semantic-search:configure

# Search indexed markdown
/semantic-search:search kubernetes deployment

# Multi-step research across results
/semantic-search:research kafka backup strategy

Comandos

Comando

Descripción

/semantic-search:configure

Instala semantic-search-http como un servicio launchd (macOS) o systemd-user (Linux) y registra el servidor MCP en Claude Code

/semantic-search:search <query> [top_k]

Búsqueda semántica a través del servidor MCP en ejecución

/semantic-search:research <topic>

Investigación de varios pasos: buscar, categorizar, leer fuentes principales, sintetizar

Ejecución en segundo plano

Para un uso de estilo producción, ejecute semantic-search-http como un servicio en segundo plano para que cada sesión de Claude Code (y cualquier cliente REST) comparta un proceso activo.

Plataforma

Guía

macOS (launchd)

docs/launchd-service.md

Linux (systemd)

docs/systemd-user-service.md

Ejemplo rápido (macOS):

launchctl load ~/Library/LaunchAgents/com.github.bborbe.semantic-search-http.plist

Ejemplo rápido (Linux):

systemctl --user enable --now semantic-search-http.service

Comandos CLI

Comandos de ejecución única sin necesidad de ejecutar un servidor:

# Search
CONTENT_PATH=/path/to/vault semantic-search search "kubernetes deployment"

# Find duplicates
CONTENT_PATH=/path/to/vault semantic-search duplicates path/to/note.md

Binarios

Binario

Propósito

semantic-search-http

Servidor HTTP combinado: MCP en /mcp + endpoints REST. Ejecutar una vez, compartir entre clientes.

semantic-search-mcp

Servidor MCP stdio: uno por sesión de Claude Code. Usar cuando el servicio HTTP no esté configurado.

semantic-search

Solo CLI: comandos de ejecución única search y duplicates.

Configuración

Variables de entorno

Variable

Descripción

Predeterminado

CONTENT_PATH

Directorio a indexar (separado por comas para múltiples)

./content

LOG_LEVEL

Nivel de registro (DEBUG, INFO, WARNING, ERROR)

INFO

Múltiples directorios

Indexe múltiples directorios separando las rutas con comas:

CONTENT_PATH=/path/to/vault1,/path/to/vault2,/path/to/docs

Todos los directorios se indexan juntos y se buscan como un índice unificado.

Cómo funciona

La primera ejecución descarga un pequeño modelo de incrustación (~90MB) e indexa sus archivos markdown (<1s para bóvedas típicas). El índice se actualiza automáticamente cuando los archivos cambian mediante un monitor del sistema de archivos.

Contenido indexado

Cada archivo markdown se indexa con componentes ponderados:

Componente

Peso

Notas

Nombre de archivo

3x

Frontmatter title

3x

Frontmatter tags

2x

Fusionado con etiquetas en línea

Frontmatter aliases

2x

Etiquetas en línea (#tag)

2x

Extraídas del cuerpo

Primer encabezado H1

2x

Contenido del cuerpo

1x

Primeras 500 palabras

Desarrollo

# Clone
git clone https://github.com/bborbe/semantic-search
cd semantic-search

# Install dev dependencies
make install

# Run checks
make check

# Run tests
make test

Licencia

Licencia BSD 2-Clause: consulte LICENSE.

Available Tools

3 tools
check_duplicatesA

Find notes that are potential duplicates of the given file.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_pathYesPath to the file (absolute or relative to content directory)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description does not disclose behavioral details beyond the basic 'Find' action—such as how duplicates are determined, whether the operation is read-only, or any side effects. The burden falls on the description, which is minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no wasted words, making it highly concise and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one parameter, output schema present), the description conveys the main purpose adequately. However, it lacks guidance on when to use vs alternatives, which is somewhat a gap but not critical for such a straightforward tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single parameter, so the schema fully describes file_path. The description adds no extra semantic meaning beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Find') and resource ('notes that are potential duplicates of the given file'), clearly distinguishing it from sibling tools like search_related and get_content.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for checking duplicates but does not explicitly state when to use this tool versus alternatives, nor any exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_contentB

Fetch the content of a file from the indexed vault.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFile path (absolute or relative to an indexed root)
queryNoSearch string to find the best-matching line (only used when snippet=True)
snippetNoIf True, return a snippet around the best-matching line instead of the full file
context_linesNoNumber of lines before and after the match to include (default 20)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states the primary action but does not disclose edge cases (e.g., file not found, path resolution), or behavior around optional parameters like snippet and query despite their existence in the schema. This leaves significant behavioral aspects undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, tightly worded sentence that immediately conveys the core purpose. There is no fluff or redundancy, and the information is front-loaded. For the tool's purpose, this length is appropriately concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has moderate complexity with optional snippet/query parameters and an output schema, and the schema covers parameter semantics. However, the description is thin on operational context, such as how path resolution works or when to use snippet mode. While not incomplete for basic selection, the description itself needed to provide more contextual glue; the schema partially compensates, but gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so a baseline of 3 is appropriate. The description itself does not add any parameter semantics beyond the schema, but the schema already documents each parameter (path, query, snippet, context_lines) clearly. The description neither enhances nor detracts from what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action ('Fetch the content of a file') and the resource ('indexed vault'), using a specific verb and resource. It distinguishes itself from sibling tools 'search_related' and 'check_duplicates' by focusing on direct content retrieval rather than search or duplication checks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It does not mention related tools or any exclusionary conditions (e.g., 'use search_related instead when looking for related content'). The intended usage is only implicitly derived from the tool's name and action.

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.

  1. 3 tool updatesv0.1.0
    • First observedcheck_duplicates
    • First observedget_content
    • First observedsearch_related

TDQS

A4/5.0

Scored across 3 tools

Disambiguation5/5

Each tool serves a distinct purpose: semantic search, duplicate detection, and content retrieval. There is no overlap or ambiguity between them.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern (search_related, check_duplicates, get_content) using snake_case. The naming is predictable and readable.

Tool Count5/5

Three tools is an appropriate, focused set for a semantic search server. Each tool earns its place and the scope is well-defined.

Completeness5/5

The server covers the core needs of semantic search: finding related notes, detecting duplicates, and retrieving content. There are no missing operations that would hinder its stated purpose.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

Appeared in Searches