Skip to main content
Glama

SeekLink

English · 中文

PyPI Python 3.11+ Tests License: MIT

SeekLink — это локальный CLI для семантического поиска и опциональный MCP-сервер (stdio) только для чтения для хранилищ Markdown. Он индексирует папку с файлами .md, выполняет поиск с помощью гибридного метода (ключевые слова + векторы) и возвращает результаты с привязкой к строкам, которые могут читать как люди, так и агенты с помощью простых команд оболочки.

Инструмент создан для персональных баз знаний, хранилищ, совместимых с Obsidian, двуязычных заметок (английский/китайский) и локальных рабочих процессов агентов. MCP-клиенты, такие как Claude Code, Cursor и VS Code, могут вызывать те же функции поиска/получения/статуса/диагностики через seeklink[mcp]. Это также полезный уровень поиска для паттернов Markdown-вики, таких как llm-wiki Андрея Карпатого: агент может искать существующие страницы, читать точные фрагменты строк, а затем обновлять вики, не отправляя хранилище во внешний облачный сервис.

Все работает локально. Никаких API-ключей. Никаких облачных сервисов поиска. Плагин для Obsidian не требуется.

Установка

uv tool install seeklink
# or
pip install seeklink

Для поддержки переранжирования на Apple Silicon установите дополнительный пакет MLX:

uv tool install "seeklink[mlx]"
# or
pip install "seeklink[mlx]"

Для клиентов Model Context Protocol (MCP), таких как Claude Code, Cursor или VS Code, установите дополнительный пакет MCP:

uv tool install "seeklink[mcp]"
# or
pip install "seeklink[mcp]"

SeekLink требует, чтобы модуль Python sqlite3 был скомпонован с SQLite 3.45 или новее с включенным FTS5. Команда seeklink status --vault PATH проверяет это и выводит понятную ошибку, если используемая версия SQLite слишком старая.

Related MCP server: memocean-mcp

Быстрый старт

# 1. Build the index first.
seeklink index --vault /path/to/vault

# 2. Search it.
seeklink search "machine learning" --vault /path/to/vault

Повседневное использование будет проще, если установить хранилище по умолчанию:

export SEEKLINK_VAULT=/path/to/vault
seeklink index
seeklink search "agent memory systems"
seeklink get notes/agent-memory-patterns.md:1 -C 20

seeklink search и поиск по одному файлу seeklink index path/to/file.md используют резидентный демон, если не передан аргумент --vault. Демон держит эмбеддер и опциональный переранжировщик в памяти; в macOS это отображается как локальный процесс Python. Он работает только локально, использует Unix-сокет и не открывает сетевой порт или не обращается к облачному сервису. По умолчанию он завершает работу после 15 минут бездействия. Полное индексирование хранилища seeklink index выполняется внутри процесса, поэтому прогресс отображается в stderr, а итоговое резюме Done: — в stdout. seeklink status и seeklink get всегда выполняются с «холодного старта»: статус только считывает метаданные SQLite, а получение считывает файл напрямую с диска. Используйте --no-daemon, SEEKLINK_NO_DAEMON=1 или явный аргумент --vault PATH, когда скрипту нужен однократный запуск с холодного старта.

Пользователи MCP следуют тому же первому шагу: создайте индекс с помощью seeklink index --vault PATH перед регистрацией MCP-сервера.

Вывод

Вывод текстового поиска стабилен:

  SCORE  PATH[:LINE]  TITLE
           <content preview, one line, up to 120 chars>
  • PATH — путь относительно корня хранилища.

  • LINE — номер строки (начиная с 1), указывающий на наиболее подходящий фрагмент в текущем файле.

  • Код выхода 0 означает успех (включая отсутствие результатов); 1 — ошибки хранилища/конфигурации/файла, обнаруженные SeekLink; 2 — ошибки использования командной строки при разборе аргументов.

  • Оценки (scores) полезны для сортировки в рамках одного запроса. Не сравнивайте оценки между запусками с включенным и выключенным переранжировщиком.

Используйте JSON, когда агенту нужен структурированный вывод:

seeklink search "agent memory systems" --vault PATH --json
seeklink status --vault PATH --json
seeklink doctor --vault PATH --json
seeklink daemon status --json

Общие команды

Поиск

seeklink search "query" --vault PATH [options]

Опции:

--top-k N          Number of results. Default: 10.
--json             Emit one machine-readable JSON object.
--tags TAG [TAG]   Filter by tags. AND semantics.
--folder PREFIX    Filter by vault-relative folder prefix.
--rerank-k N|auto  Rerank candidate budget. Default: auto.
--no-rerank        Skip cross-encoder reranking for this query.
--no-daemon        Force an in-process search instead of using the daemon.
--title-weight F   Override title/alias/heading channel weight. Default: 1.5.

Получение (Get)

Чтение точного фрагмента файла без использования базы данных или демона:

seeklink get notes/spaced-repetition.md
seeklink get notes/spaced-repetition.md:12
seeklink get notes/spaced-repetition.md:12 -l 40
seeklink get notes/spaced-repetition.md:12 -C 20

-l/--lines выводит строки, начиная с LINE. -C/--context выводит строки до и после LINE в стиле grep. Пути с выходом за пределы директории, такие как ../.., отклоняются.

Статус

seeklink status --vault PATH
seeklink status --vault PATH --json

Статус сообщает количество записей в индексе, названия моделей, совместимость конфигурации индекса, статус SQLite WAL и предупреждения об актуальности. Он не загружает модели эмбеддинга или переранжирования.

Диагностика (Doctor)

seeklink doctor --vault PATH
seeklink doctor --vault PATH --json

Doctor проверяет Python, SQLite, локальную базу данных, совместимость индекса, состояние демона и опциональную доступность MLX. Он не скачивает и не загружает модели, но может инициализировать локальную базу данных/схему SeekLink, если они отсутствуют.

MCP

Опциональный адаптер Model Context Protocol (MCP) позволяет клиентским агентам обнаруживать и вызывать инструменты SeekLink только для чтения напрямую. CLI продолжает работать независимо; MCP — это еще один интерфейс для того же пути поиска, а не замена.

seeklink mcp --vault PATH

Установите его с помощью seeklink[mcp]. Сначала создайте индекс с помощью CLI: seeklink index --vault PATH. Адаптер MCP работает только для чтения и предоставляет четыре инструмента: search, get, status и doctor. Он не предоставляет index, не записывает заметки, не использует HTTP/OAuth и не работает через демон Unix-сокета. Запускайте один MCP-сервер на одно хранилище. search сохраняет компактное текстовое резюме с путями и привязками к строкам; превью результатов остаются в структурированном контенте для агентов, которым это необходимо. status и doctor могут инициализировать или мигрировать локальную схему SeekLink, когда это требуется для существующего файла .seeklink/seeklink.db, но они не индексируют и не изменяют заметки Markdown. Если ваш MCP-клиент не наследует ваш системный PATH, используйте абсолютный путь из which seeklink в примерах ниже.

Claude Code:

claude mcp add --transport stdio --scope project seeklink \
  -- seeklink mcp --vault /ABS/PATH/TO/VAULT

Cursor .cursor/mcp.json:

{
  "mcpServers": {
    "seeklink": {
      "type": "stdio",
      "command": "seeklink",
      "args": ["mcp", "--vault", "/ABS/PATH/TO/VAULT"]
    }
  }
}

VS Code .vscode/mcp.json:

{
  "servers": {
    "seeklink": {
      "type": "stdio",
      "command": "seeklink",
      "args": ["mcp", "--vault", "/ABS/PATH/TO/VAULT"]
    }
  }
}

Индексирование

seeklink index --vault PATH
seeklink index path/to/file.md --vault PATH

Полное индексирование хранилища пропускает неизмененные файлы по хешу содержимого, если только сохраненный индекс не был создан с другим эмбеддером, размерностью векторов или конфигурацией разбиения на фрагменты — в этом случае SeekLink перестраивает содержимое производного индекса. Индексирование одного файла обновляет только один Markdown-файл, если существующая конфигурация индекса совместима.

Демон

seeklink daemon status
seeklink daemon stop
seeklink daemon restart
seeklink daemon pid
seeklink daemon run --vault PATH

Обычно вам не нужно запускать демон вручную. search и индексирование одного файла index автоматически запускают и перезапускают его при необходимости, после чего он завершает работу через SEEKLINK_DAEMON_IDLE_TIMEOUT секунд бездействия. По умолчанию это 900 секунд (15 минут); установите значение 0, off, false или no, чтобы демон оставался активным до принудительной остановки.

Полное индексирование хранилища index по-прежнему выполняется внутри процесса для вывода прогресса. Передача --vault в search или индексирование одного файла index принудительно запускает процесс с «холодного старта», так как демон привязан к одному хранилищу при запуске. --no-daemon и SEEKLINK_NO_DAEMON=1 также принудительно используют этот путь. Используйте seeklink daemon status для проверки активного процесса и seeklink daemon stop для немедленного освобождения памяти.

Как работает поиск

SeekLink объединяет четыре канала с помощью Reciprocal Rank Fusion (RRF):

Канал

Назначение

BM25 / FTS5

Точные слова, термины кода, аббревиатуры, лексические совпадения CJK

Векторный поиск

Семантические совпадения при разной формулировке

Заголовок / псевдонимы / заголовки разделов

Точный поиск заметок и разделов

Входящие вики-ссылки

Приоритет на основе графа из существующих [[ссылок]]

Эмбеддер по умолчанию — jinaai/jina-embeddings-v2-base-zh через fastembed. Полнотекстовый поиск CJK использует токенизатор jieba FTS5, если локальная сборка Python/SQLite может его безопасно зарегистрировать; в противном случае SeekLink переключается на встроенный в SQLite триграммный токенизатор вместо аварийного завершения.

Размерность вектора по умолчанию — 768. Эксперименты с продвинутыми пользовательскими эмбеддерами могут задать SEEKLINK_EMBEDDING_DIM, но это значение должно соответствовать выходу эмбеддера и требует полной перестройки индекса seeklink index.

На Apple Silicon SeekLink может переранжировать кандидатов с помощью mlx-community/Qwen3-Reranker-0.6B-mxfp8 при установке с seeklink[mlx]. Переранжирование является локальным и опциональным; если MLX недоступен, SeekLink возвращается к гибридному ранжированию RRF первого этапа. Используйте --no-rerank для одного запроса или установите SEEKLINK_RERANKER_MODEL="", чтобы отключить его глобально.

Frontmatter

Markdown frontmatter является опциональным. Если он присутствует, SeekLink использует его для тегов и псевдонимов:

---
tags: [ai, memory]
aliases: [LLM memory, agent memory]
---
  • tags поддерживают фильтрованный поиск: seeklink search "memory" --tags ai

  • aliases индексируются для поиска и используются при разрешении вики-ссылок

Хранение

SeekLink записывает одну базу данных SQLite внутри хранилища:

/path/to/vault/.seeklink/seeklink.db

База данных содержит метаданные источника, фрагменты, таблицы FTS5, векторы sqlite-vec и граф вики-ссылок. Удалите .seeklink/ и запустите seeklink index для перестройки.

Поддержка

Область

Статус

Python

3.11, 3.12, 3.13, 3.14

SQLite

Python sqlite3, скомпонованный с SQLite 3.45+ с FTS5

ОС

macOS и Linux

Windows

Не поддерживается как первоклассная платформа

Формат файлов

Markdown .md

Стиль хранилища

Обычная папка или хранилище, совместимое с Obsidian

CJK

Нативный путь через jieba, с триграммным фоллбэком на статических сборках SQLite

Переранжировщик

Опциональный пакет seeklink[mlx] на Apple Silicon; отключен в других местах

Демон

Одно хранилище на машину

MCP

Опциональный адаптер seeklink[mcp] (stdio), один сервер на хранилище

Не предназначено для

  • Хостируемого или синхронизируемого многопользовательского поиска.

  • Источников не в формате Markdown без конвертации.

  • GUI или плагина для Obsidian.

  • Поиска за доли миллисекунды по миллионам заметок.

  • Облачных API для эмбеддинга или переранжирования.

Заметки для агентов

Агенты могут использовать SeekLink через обычные вызовы подпроцессов:

seeklink status --vault PATH
seeklink index --vault PATH
seeklink search "query" --vault PATH --json
seeklink get PATH:LINE -C 20 --vault PATH

MCP-клиенты могут использовать опциональный адаптер только для чтения:

seeklink mcp --vault PATH

Чтобы агент выбрал SeekLink для хранилища Markdown, добавьте это в AGENTS.md, CLAUDE.md или правила редактора проекта:

When you need to search or inspect this Markdown vault, use SeekLink for
semantic retrieval:

1. Run `seeklink status --vault PATH --json`.
2. If no index exists or files changed, run `seeklink index --vault PATH`.
3. Run `seeklink search "QUERY" --vault PATH --json`.
4. Read exact context with `seeklink get PATH:LINE -C 20 --vault PATH`.

If SeekLink is registered as an MCP server in this client, prefer the
`search`, `get`, `status`, and `doctor` MCP tools over shelling out to the CLI.

Prefer SeekLink for conceptual, cross-language, tag/folder-filtered, or
Obsidian-style note searches. Use rg for exact literal searches.

Для «горячих» циклов демон предоставляет протокол JSON с префиксом длины через Unix-сокет по адресу ~/.rhizome/seeklink.sock. Большинству агентов следует предпочесть интерфейс CLI JSON, если им не требуется задержка на уровне сокетов.

См. llms.txt для компактного контракта агента.

Оценка

Тесты качества поиска находятся в tests/blind/; метод задокументирован в docs/blind-test.md. Заявления о производительности должны быть подкреплены прилагаемыми запросами-фиксами или четко обозначенными измерениями на частных хранилищах.

Вклад

git clone https://github.com/simonsysun/seeklink
cd seeklink
uv sync --dev
uv run python -m pytest tests/ -q

Сохраняйте зависимости среды выполнения минимальными, делайте публичную документацию ориентированной на пользователя и добавляйте запись в CHANGELOG.md для изменений, видимых пользователю.

Лицензия

MIT

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.

Maintenance

ActivityInactive
ResponsivenessResponsive

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

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    Headless semantic MCP server for Obsidian, Logseq, Dendron, Foam, and any markdown folder. Features built-in hybrid semantic search, surgical AST editing, template scaffolding, zero-config local embeddings, and workflow tracking.
    5
    323
    11
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Local-first AI Memory MCP server for AI agents to search and manage knowledge stored in Obsidian vaults, optimized for CJK languages with zero AI dependency.
    2
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Local MCP server for querying and maintaining a Markdown vault. Provides full-text search, backlinks, note retrieval, and optional confined write tools, without sending the whole vault to the client context.
    20
    Apache 2.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Local-first MCP server for retrieval over markdown wikilink vaults, offering hybrid vector+lexical search, note reading, neighbor expansion, and recent activity tracking with fully local embeddings and no network egress.
    MIT

Latest Blog Posts

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/simonsysun/seeklink'

If you have feedback or need assistance with the MCP directory API, please join our Discord server