course / AI Anti-Magic: use AI like a PRO

MCP-сервер для Obsidian: внешний доступ к волту

Что такое MCP

MCP (Model Context Protocol) — открытый протокол, через который AI-агенты подключаются к внешним сервисам. Думай про USB-C: один стандартный разъём, через который можно подключить что угодно — файлы, базы данных, API, инструменты.

Без MCP агент умеет только разговаривать. С MCP — он может читать твои заметки, искать по волту, создавать файлы и вообще делать полезную работу.

Пример из жизни: ты подключаешь свой Obsidian-волт как MCP-сервер → даёшь ссылку внешнему агенту (Claude, GPT, другому AI) → агент может читать и писать заметки в твой волт. Удалённо, безопасно, через интернет.

Зачем это нужно

Архитектура

Вот что мы строим:

Obsidian Vault (твой компьютер)
  → Obsidian REST API плагин (localhost:27124)
    → MCP-сервер (localhost:8787)
      → Auth-прокси с OAuth (localhost:8788)
        → Cloudflare Tunnel
          → https://mcp.твой-домен.com
            → Внешний AI-агент

Каждый слой решает свою задачу:

Что понадобится

Шаг 1: Obsidian REST API

Установи плагин Local REST API в Obsidian:

  1. Settings → Community Plugins → Browse → ищи "Local REST API"
  2. Install → Enable
  3. В настройках плагина скопируй API Key — он понадобится дальше

Плагин запустит локальный сервер на https://localhost:27124. Проверь:

curl -sk https://localhost:27124/

Должен вернуть JSON со статусом OK.

Шаг 2: MCP-сервер

Используем пакет obsidian-mcp-server — он оборачивает REST API в MCP-протокол и даёт полный набор инструментов: чтение, запись, поиск, теги, frontmatter.

Проверь что работает:

OBSIDIAN_API_KEY="твой-api-key" \
OBSIDIAN_BASE_URL="https://127.0.0.1:27124" \
MCP_TRANSPORT_TYPE="http" \
MCP_HTTP_PORT="8787" \
npx obsidian-mcp-server

Доступные инструменты MCP-сервера:

Инструмент Что делает
obsidian_list_notes Список файлов в папке
obsidian_read_note Чтение заметки
obsidian_update_note Создание/обновление (append, prepend, overwrite)
obsidian_delete_note Удаление
obsidian_global_search Полнотекстовый поиск по волту
obsidian_search_replace Найти и заменить в файле
obsidian_manage_frontmatter Работа с YAML-метаданными
obsidian_manage_tags Управление тегами

Шаг 3: Auth-прокси

MCP-сервер сам по себе не имеет авторизации. Любой, кто знает адрес — получит доступ. Нам нужен прокси, который проверяет токен.

Попроси своего coding-агента (Claude Code, Cursor) создать auth-прокси. Вот что он должен делать:

Обязательные endpoints:

Что сказать агенту:

Создай Node.js auth-прокси для MCP-сервера. Он должен:

  1. Слушать на порту 8788
  2. Проксировать запросы к upstream MCP-серверу на localhost:8787
  3. Реализовать полный OAuth 2.0 Authorization Code flow с PKCE
  4. Поддерживать grant_types: authorization_code, client_credentials, refresh_token
  5. Endpoint /authorize должен auto-approve и сразу редиректить с кодом
  6. Токены должны персистентно сохраняться в JSON-файл (чтобы переживать рестарты)
  7. Для POST /mcp — автоматически подставлять Accept: application/json, text/event-stream
  8. Логировать все запросы

Результат: файл ~/.claude/scripts/mcp-auth-proxy.mjs (или в любом удобном месте).

После создания — запомни свои Client ID и Client Secret. Они понадобятся для подключения внешних агентов.

Шаг 4: Ограничение доступа к папкам

По умолчанию MCP-сервер даёт доступ ко всему волту. Это опасно — внешний агент сможет читать дневник, финансы, личные заметки.

Попроси агента добавить в auth-прокси фильтр путей:

Добавь в прокси проверку путей. При каждом tools/call запросе проверяй аргументы notePath, dirPath, pathFilter. Если путь не начинается с разрешённых директорий — возвращай MCP-ошибку "access denied". Разрешённые директории: 540 Research, 530 External Agents.

Теперь внешний агент может работать только с указанными папками. Попытка прочитать Daily/ или 200 Projects/ вернёт ошибку.

Шаг 5: Cloudflare Tunnel

Быстрый тест (без домена)

cloudflared tunnel --url http://localhost:8788

Даст временный URL вроде https://random-words.trycloudflare.com. Работает, но URL меняется при перезапуске.

Постоянный домен (named tunnel)

  1. Авторизуй cloudflared (один раз):
cloudflared tunnel login
  1. Создай именованный туннель:
cloudflared tunnel create obsidian-mcp
  1. Добавь DNS-запись:
cloudflared tunnel route dns obsidian-mcp mcp.твой-домен.com
  1. Настрой ~/.cloudflared/config.yml:
tunnel: <tunnel-id>
credentials-file: ~/.cloudflared/<tunnel-id>.json

ingress:
  - hostname: mcp.твой-домен.com
    service: http://localhost:8788
  - service: http_status:404
  1. Запусти:
cloudflared tunnel run <tunnel-id>

Шаг 6: Автозапуск (launchd)

Всё должно запускаться при загрузке Mac и перезапускаться при падении. Попроси агента:

Создай bash-скрипт, который запускает: 1) obsidian-mcp-server на порту 8787, 2) auth-proxy на порту 8788, 3) cloudflared tunnel run. Если любой процесс падает — скрипт завершается, а launchd перезапускает его. Создай launchd plist с KeepAlive: true и RunAtLoad: true.

Результат:

Управление:

# Загрузить (запустить)
launchctl load ~/Library/LaunchAgents/com.claude.mcp-obsidian-tunnel.plist

# Выгрузить (остановить)
launchctl unload ~/Library/LaunchAgents/com.claude.mcp-obsidian-tunnel.plist

# Проверить статус
launchctl list | grep mcp-obsidian

# Логи
tail -f ~/.claude/scripts/mcp-obsidian-tunnel.log

Шаг 7: Подключение внешнего агента

Когда всё запущено, подключай MCP-сервер в любом совместимом клиенте.

URL сервера:

https://mcp.твой-домен.com/mcp

Авторизация (OAuth client credentials):

В Claude.ai (Projects → Integrations → Add MCP):

  1. Введи URL сервера
  2. Заполни OAuth client credentials
  3. Нажми Connect
  4. Агент получит доступ к разрешённым папкам

Проверка работоспособности

# Все процессы живы?
lsof -iTCP:8787 -sTCP:LISTEN -P
lsof -iTCP:8788 -sTCP:LISTEN -P
ps aux | grep cloudflared

# OAuth discovery работает?
curl -s https://mcp.твой-домен.com/.well-known/oauth-authorization-server

# MCP отвечает?
curl -s -X POST \
  -H "Authorization: Bearer <твой-токен>" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}' \
  https://mcp.твой-домен.com/mcp

# Ограничение папок работает?
# (попробуй обратиться к запрещённой папке — должен вернуть access denied)

Итого: что получилось

Obsidian ← REST API ← MCP-сервер ← Auth-прокси ← Cloudflare ← Интернет
              ↑              ↑             ↑            ↑
         Плагин        8 инструментов   OAuth 2.0   Постоянный
         в Obsidian    read/write/      + PKCE      домен
                       search/tags      + фильтр
                                        папок

Курс AI Obsidian — 3 недели, 9 встреч, максимум 20 человек

Записаться →