Skip to main content
Glama
MothBlight-Git

Pyre MCP Server

Pyre — горящие заметки на рабочем столе

Безрамная, прозрачная, всегда поверх окон панель из квадратных бумажных заметок на краю монитора. Заметка с дедлайном сгорает снизу в течение последних двух часов. Перетаскивайте заметки куда угодно; горящие занимают верхний левый угол, если вы не переместили их сами. Всё читаемо и записываемо ИИ-агентом. Один портативный Pyre.exe.

Контракт сборки: CLAUDE.md. Файлы дизайна: reference/.


Запуск

Портативный: поместите Pyre.exe куда угодно и дважды щёлкните. Никакой установки, никаких прав администратора. Чтобы данные хранились рядом с exe (USB-флешка, синхронизированная папка), создайте пустой файл с именем pyre.portable рядом с ним — или просто создайте папку pyre-data/ рядом.

Установленный: Pyre-Setup-x.y.z.exe добавляет запись в меню «Пуск». Данные хранятся в %USERPROFILE%\.stickyburn\.

Из исходников:

npm install
npm test          # 63 tests: burn curve, grid, parser, talk lane, store, MCP stdio + HTTP end-to-end
npm start         # build + launch
npm run dist      # release/Pyre.exe (single-file portable) · Pyre-Setup-*.exe (installer) · Pyre-*-win.zip (portable folder)

Related MCP server: Bruin

Использование

Введите в поле ввода: topic / comment / due затем Enter.

  • winwater / send BEP to Powell / fri 9am

  • / just a thought → сохраняется в UNSORTED

  • Формы срока: today tonight tomorrow fri 3d 2w 4h 8/21 2026-08-21 8/21 3pm fri 9am 3pm. Время по умолчанию 17:00 (настройки).

  • Три чипа показывают разбор в реальном времени. Чип срока всегда показывает разрешённую дату, а не то, что вы ввели. Если последний сегмент не является датой, он остаётся частью комментария.

  • Канал разговора. Строка, начинающаяся с >, является сообщением для подключённого агента, а не заметкой: > move winwater to friday. Она появляется в канале под компоновщиком, агент читает её с помощью list_messages и отвечает с помощью send_message. > переопределяет всё, поэтому сообщение может свободно содержать косые черты.

  • Команды строки. Строка без /, содержащая quit (или exit), закрывает приложение — строка чипов заменяется на единственный чип QUIT PYRE, чтобы вы могли видеть, что сделает Enter, прежде чем подтвердить. Всё, что содержит /, всегда является заметкой, поэтому / quit всё равно создаёт заметку.

Действие

Мышь

Клавиатура (фокус на заметке)

Отметить выполненным (потушить)

наведение → ✓

Ctrl+Enter

Редактировать на месте

наведение → ✎

Enter

Отложить на 2ч / остаток дня (отсрочка — никогда не меняет срок)

наведение → ◐ / Shift+щелчок

B / Shift+B (повторно для отмены отсрочки)

Освободить закреплённую заметку обратно в авто

наведение → ⇱

R

Удалить

наведение → ✕

Delete

Переместить (закрепить)

перетащить

—

Отменить перетаскивание

Esc

Новая заметка откуда угодно

Ctrl+Alt+N (глобально)

Архив выполненных / Настройки

DONE / SETTINGS под полем ввода

Ctrl+, для настроек

Изменить размер панели (280–420)

перетащите его внутренний край или ползунок в Настройках

Переместить окно

перетащите невидимую полоску 28px вдоль верхнего края

Выход

значок в трее → Выход из Pyre

введите quit или exit в строке → Enter

Разговор с агентом

кнопка TALK открывает канал

введите > ваше сообщение в строке → Enter

Правило размещения. Автоматические заметки сортируются по нагреву (самые горячие сверху слева), затем датированные выше недатированных, затем новые. Заметка, которую вы перетащили, занимает свою ячейку навсегда — огонь будет обтекать её, никогда не вытесняя. Если закреплённая заметка загорится ниже сгиба, в правом нижнем углу появляется точка-уголёк; нажмите на неё, чтобы прокрутить туда.

Состояния. холодная · прогревается (срок установлен, > 2ч; свечение разгорается за последние 24ч) · срок · горит · критическое · просрочено · погасшая (> 7 дней просрочки) · отложенная.

Где находятся данные

Один JSON-файл, разрешаемый в таком порядке (первый совпавший выигрывает):

  1. Переменная окружения PYRE_DATA → эта папка

  2. Маркер pyre.portable рядом с exe → .\pyre-data\

  3. .\pyre-data\ рядом с exe уже существует и доступно для записи → портативный

  4. %USERPROFILE%\.stickyburn\ → установленный

notes.json и settings.json находятся вместе там. Настройки → Данные показывает точный разрешённый путь (и предупреждает, если портативное расположение не было доступно для записи и произошёл откат). Доступность для записи проверяется реальной записью временного файла, потому что USB-флешки и заблокированные корпоративные папки могут врать.

Формат файла — это контракт (см. src/shared/types.ts):

{
  "version": 2,
  "notes": [{
    "id": "n_8f2k4a", "topic": "WINWATER", "comment": "Send BEP to Powell",
    "due": "2026-08-21T22:00:00.000Z",          // ISO UTC or null
    "created": "…", "updated": "…", "done": false, "doneAt": null,
    "bankedUntil": null, "bankedAt": null,      // snooze; never touches due
    "placement": { "mode": "auto" },            // or { "mode":"manual", "col":0, "row":2, "pinnedAt":"…" }
    "source": "user"                            // "agent" draws a 2px tick on the left edge
  }],
  "messages": [{                                // optional; the talk lane
    "id": "m_4k2p9a", "role": "user",           // "user" | "agent"
    "text": "move winwater to friday",
    "created": "…", "read": false               // read = the OTHER side has seen it
  }]
}

burn, warmth и state никогда не сохраняются — они вычисляются из due и часов каждый тик.

Доступ ИИ

Два пути, один файл, один наблюдатель.

1. Просто редактируйте файл

Направьте Claude Code (или любой скрипт) на notes.json. Записи подхватываются в течение ~300 мс и анимируются на стене; собственные записи приложения атомарны (.tmp → fsync → переименование), так что файл, записанный наполовину, никогда не читается. Дайте агенту src/shared/types.ts как схему.

2. Встроенный MCP-сервер — два транспорта, одни и те же инструменты

Инструменты: list_notes (с вычисленными burn/state/slot) · add_note · update_note · move_note · release_note · bank_note · snuff_note · restore_note · delete_note · parse_line (пробный прогон грамматики) · get_grid (карта занятости + первая свободная ячейка) · list_messages и send_message (канал разговора).

Канал разговора работает по принципу pull. Когда пользователь вводит > …, это записывается в файл и отображается как ожидающее, но ничего не отправляется вам — агент видит это, когда вызывает list_messages. Опрашивайте это в начале сеанса или всякий раз, когда пользователь упоминает Pyre. Приложение и MCP-сервер используют общий src/shared/heat.ts, поэтому burn агента в точности соответствует тому, что на экране.

Настройки → Доступ ИИ показывает обе конфигурации с правильным путём/портом и кнопками КОПИРОВАТЬ.

(а) Локальная HTTP-конечная точка — работает из любой сборки, пока панель открыта, Node не требуется

Запущенное приложение предоставляет streamable-HTTP MCP по адресу http://127.0.0.1:41777/mcp (порт в Настройках; 0 = выкл; только loopback).

{ "mcpServers": { "pyre": { "url": "http://127.0.0.1:41777/mcp" } } }

Клиент

Как

Cursor

вставьте в .cursor/mcp.json (проект) или %USERPROFILE%\.cursor\mcp.json (глобально) — Cursor Settings → MCP

Claude Code

claude mcp add --transport http pyre http://127.0.0.1:41777/mcp

Claude Desktop

только stdio на сегодня — используйте (б), или мост с npx mcp-remote http://127.0.0.1:41777/mcp если у вас есть Node

(б) stdio — Pyre.exe --mcp, работает даже когда панель закрыта

{ "mcpServers": { "pyre": { "command": "C:\\path\\to\\Pyre.exe", "args": ["--mcp"] } } }

Клиент

Где

Claude Desktop

%APPDATA%\Claude\claude_desktop_config.json (Настройки → Разработчик → Редактировать конфиг)

Cursor

.cursor/mcp.json / ~/.cursor/mcp.json

Claude Code

claude mcp add pyre -- "C:\path\to\Pyre.exe" --mcp

Какой Pyre.exe? Установочная сборка и сборка портативной папки (Pyre-x.y.z-win.zip, распакуйте куда угодно) являются настоящим бинарным файлом и отвечают на stdio MCP. Однофайловый портативный Pyre.exe — это загрузчик NSIS, который извлекает и запускает настоящее приложение без передачи stdio, поэтому --mcp не может работать через него — Настройки обнаруживают это и показывают только HTTP-конфигурацию. Запуск из исходников: command = node_modules\electron\dist\electron.exe, args = ["<repo path>", "--mcp"].

Доступность

prefers-reduced-motion даёт полную альтернативную презентацию (без переходов, без угольков, без мерцания — переднее положение, свечение и обратный отсчёт несут информацию). Каждая заметка доступна через Tab со всеми действиями на клавишах; доступное имя читается как «WINWATER. Send BEP to Powell. Due in 6 minutes. Pinned to column 1, row 3.»

Структура репозитория

src/main       Electron main: window, tray, hotkey, paths, store (atomic + watcher), IPC, --mcp branch
src/preload    contextBridge → window.pyre
src/renderer   plain TS + CSS: grid, drag, composer, sheets, embers  (styles/burn-system.css is verbatim, do not edit)
src/shared     heat.ts (THE burn curve) · grid.ts (THE placement rule) · parse.ts (THE grammar) · types · migrate
src/mcp        stdio MCP server (imports the shared modules + the store)
test           vitest: pyre (spec), parse, store, mcp
reference/     the approved design files, kept for comparison
scripts/       dev helpers (debug driver client, icon)

Заметки для разработчиков

  • PYRE_DEBUG=1 логирует активность хранилища/наблюдателя. PYRE_DEVTOOLS=1 открывает DevTools. PYRE_DEBUG_DRIVER=<dir> включает файловый отладочный драйвер (scripts/drive.mjs), который может делать снимки экрана и скриптовать активное окно.

  • Запуск рендерера вне Electron (npx vite --config vite.config.mts) устанавливает в памяти мост-заглушку с примерами заметок во всех состояниях — удобно для визуальной проверки по reference/note-example.html.

  • Решения по открытым пунктам спецификации: 9A погасшая (не 9B застопоренная); 24-часовое фоновое тепло сохранено; закреплённая заметка никогда не освобождается автоматически; без подтверждения тушения; один дисплей через настройки.

  • reserveScreenSpace регистрирует панель как Windows AppBar (через koffi → SHAppBarMessage), поэтому развёрнутые окна останавливаются у её края. Две вещи делают это сложным и стоит знать, если вы с этим работаете: резервирование должно вычисляться из прямоугольника монитора, а не рабочей области (которая уже исключает вашу собственную панель, так что она смещается по экрану), и оно должно быть в физических пикселях, а не в DIP-ах Electron. Весь путь обёрнут, так что неудача FFI означает только то, что настройка ничего не делает.

  • Сообщения канала разговора живут в том же notes.json в необязательном массиве messages, поэтому один наблюдатель доставляет оба. Файл без ключа остаётся валидным и получает его только при первом использовании канала.

  • Одно исправление к shipped-спецификации: spec/heat.ts замораживал сгорание отложенной заметки на момент bankedUntil (будущее) и не проходил свой собственный тест; запись теперь содержит bankedAt, и фронт замораживается на уровне сгорания, который был на момент начала отсрочки.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for AI agents to read, write, and organize notes in a local-first, human-in-the-loop note-taking app.
    5 npm
    2
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables creating, reading, updating, and deleting sticky notes with persistent text file storage through the MCP protocol.
    4
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    A local MCP server that provides AI agents with persistent sticky-note memory, storing Markdown notes on disk and offering tools for creating, reading, updating, deleting, searching, and listing notes across sessions.
    13
    MIT