Skip to main content
Glama

pebble-index-mcp

MCP-мост, который открывает локальное хранилище Obsidian и экземпляр Hermes Agent для MCP-песочницы двойного нажатия умного кольца Pebble Index 01. Голосовые записи с кольца маршрутизируются облачным агентом приложения Pebble в инструменты этого сервера, а ответ возвращается в виде уведомления на телефоне.

Архитектура

[Index ring] → [Pebble app] → [Pebble cloud agent] → [this MCP server]
                                                        ├─ vault tools (local files)
                                                        └─ ask_hermes → Hermes API server
  • Сервер говорит по MCP через Streamable HTTP (официальный SDK mcp, FastMCP).

  • Каждый запрос должен содержать bearer-токен; всё остальное получает 401.

  • Защита FastMCP от DNS-rebinding включена: разрешённые хосты — loopback плюс всё, что указано в MCP_ALLOWED_HOSTS.

  • Публичный доступ — это туннель cloudflared к порту loopback; никакой облачной инфраструктуры, кроме этого, не требуется.

Related MCP server: Obsidian MCP Server

Компоненты

Путь

Роль

src/pebble_index_mcp/vault.py

Vault: чтение/добавление с песочницей по путям + поиск ripgrep по хранилищу. Все пути разрешаются внутри корня хранилища; абсолютные пути, обход .. и побег через симлинки отклоняются. Добавления — только append-only, с меткой времени, никогда не перезаписывают.

src/pebble_index_mcp/hermes.py

HermesClient: пересылает вопросы на OpenAI-совместимую конечную точку chat completions с системной подсказкой для коротких ответов. Преобразует таймауты/сбои транспорта/некорректные формы в HermesTimeout/HermesError.

src/pebble_index_mcp/server.py

Приложение FastMCP: регистрирует четыре инструмента и промпт ring_persona, оборачивает streamable-http приложение в bearer-аутентификацию (сравнение за постоянное время) и настраивает разрешённые хосты.

Инструменты

  • vault_search(query, max_results=5) — текстовый поиск без учёта регистра; возвращает строки path: excerpt.

  • vault_read(note_path, max_chars=1500) — читает начало заметки.

  • vault_append(note_path, text) — добавляет строку с меткой времени - HH:MM text, создавая заметку при необходимости.

  • ask_hermes(question) — пересылает на API-сервер Hermes; таймаут 60 секунд с честным подтверждением при промахе.

Безопасность

  • Аутентификация: статический bearer-токен (MCP_BEARER_TOKEN), сравнение за постоянное время, требуется для каждого запроса. Пустой токен закрывает доступ (все запросы 401) и логирует предупреждение при запуске.

  • Транспорт: TLS завершается на границе туннеля; источник слушает только loopback.

  • Проверка хоста: защита от DNS-rebinding отклоняет запросы, у которых заголовок Host не является loopback или не входит в MCP_ALLOWED_HOSTS.

  • Песочница путей: инструменты хранилища разрешают все пути и требуют, чтобы они оставались внутри корня хранилища; побег через симлинки отклоняется, а при открытии файлов используется O_NOFOLLOW для последнего компонента. Песочница защищает от случайного и удалённого неправильного использования; враждебный локальный процесс, который гоняется за подменой родительского каталога, всё ещё может выиграть (документированная граница TOCTOU — предполагается, что хранилище является доверенным однопользовательским каталогом).

  • Конфигурация читается один раз при импорте: ротация bearer-токена или изменение разрешённых хостов требует перезапуска службы.

  • Секреты: ключ API Hermes и MCP-токен хранятся в env-файле с правами 0600 вне этого репозитория, никогда в коде, логах или коммитах.

  • Примечание о конфиденциальности: записи, маршрутизируемые через песочницу двойного нажатия, проходят через облачный агент приложения Pebble. Записи одиночного нажатия остаются на устройстве. Чувствительные мысли принадлежат одиночному нажатию.

Конфигурация (env)

Переменная

По умолчанию

Назначение

VAULT_PATH

—

Обязательно. Корень хранилища для файловых инструментов

MCP_HOST / MCP_PORT

127.0.0.1 / 8765

Адрес прослушивания

MCP_BEARER_TOKEN

—

Обязательно; токен аутентификации запросов

MCP_ALLOWED_HOSTS

—

Дополнительные разрешённые значения Host через запятую (сюда входит публичное имя хоста туннеля)

HERMES_API_URL

http://127.0.0.1:8642/v1/chat/completions

Цель для ask_hermes

HERMES_API_KEY

—

Bearer-ключ API-сервера

RING_MODEL

pebble-ring

Псевдоним модели, отправляемый вышестоящему серверу (сопоставьте его с дешёвой моделью через model_routes API-сервера)

RING_PERSONA_FILE

—

Необязательный путь к текстовому файлу, заменяющему общую персону облачного агента

HERMES_API_URL принимает любую OpenAI-совместимую конечную точку chat completions, поэтому ask_hermes работает напрямую с OpenRouter, Ollama или любым другим совместимым API — Hermes — это просто значение по умолчанию.

Разработка

python3 -m venv .venv
.venv/bin/pip install -e ".[dev]"
.venv/bin/pytest -v

Локальный запуск: задайте переменные окружения выше и выполните python -m pebble_index_mcp.server.

Развёртывание

deploy/ содержит шаблон пользовательского юнита systemd и шаблон туннеля cloudflared (имя хоста и учётные данные заполняются на хосте, а не в этом репозитории). См. docs/ring-checklist.md для настройки на стороне телефона и матрицы тестов.

Лицензия

MIT — см. LICENSE.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers