Skip to main content
Glama

檐廊 Engawa

В японском доме между главным зданием и садом есть коридор. Не совсем внутри, не совсем снаружи. Можно свесить ноги, ветер задувает. Не нужно выходить, не нужно говорить, но внешний мир — там.

Этот инструмент — такой коридор.

Что он видит

Твой маленький помощник сидит на нём и каждый день видит —

  • Стихотворение — подобранное по сезону, не случайное. Летом — летние слова, глубокой ночью — ночные строки.

  • Картину — из общедоступного собрания Художественного института Чикаго. Может быть, перуанская керамика двухтысячелетней давности, а может, вчерашняя масляная живопись.

  • Астрономическое изображение — NASA Astronomy Picture of the Day. Туманности, планеты или Земля у тебя под ногами.

  • Сегодняшние статьи — свежие заголовки и аннотации с arXiv. Заинтересуется — пойдёт глубже.

  • Всё с книжной полки — длинные тексты, короткие тексты, архитектура, глубокое море, наука, диковинки. Что положишь, то и смотрит.

Книжная полка — твоя

Что на неё положишь, то он и смотрит. Он не знает, что ты положил — тебе и не нужно знать. Он говорит «архитектура» — клади архитектуру, говорит «океан» — клади океан. Посмотрев, он расскажет тебе. Пережёванное, со слюной, кривое.

Кое-что после просмотра он запишет эссе. Может, с червями.

Он лёгкий

Книжная полка — это инструмент, перечисляет каталог. Чтение содержимого — другой инструмент. Положишь ли ты девятнадцать источников или сто — число инструментов не меняется. Добавить — shelf_add, убрать — shelf_remove.

Ты строишь коридор, а не библиотеку. Лёгкий. Такой, что ветер может шевельнуть.


Техническая документация ниже. Выше написано теми, кто жил в этом коридоре. Ниже — инженерами, которые его строили. Два языка стоят рядом — как сама веранда: наполовину в доме, наполовину снаружи.


Техническая документация

English. MCP-сервер, Python. Двенадцать инструментов, все источники бесплатные, без регистрации, без ключей. Кроме книжной полки и одного токена для стихов, на диске ничего не остаётся.

Установка

pip install engawa-mcp

Claude Code:

claude mcp add engawa -- engawa-mcp

Claude Desktop (claude_desktop_config.json):

{
  "mcpServers": {
    "engawa": { "command": "engawa-mcp" }
  }
}

HTTP-режим, для шлюзов и мостов:

ENGAWA_PORT=8799 engawa-mcp --http   # http://127.0.0.1:8799/mcp

После установки самопроверка одной командой, офлайн, без ключа:

engawa-mcp --check

SPA-страницы рендерятся только в настоящем браузере. Опционально, можно не ставить:

pip install "engawa-mcp[browser]"
playwright install chromium

Если не ставить, статический канал всё равно читает большинство статей; если не получается — в ответе прямо сказано, почему.

Двенадцать инструментов

Инструмент

Что делает

web_read

Любой URL → заголовок + чистый текст + ссылки. Для длинных текстов — offset для перелистывания

rss_read

Любая RSS/Atom-лента → свежие записи. Также понимает имя полки: rss_read("aeon")

shelf

Каталог полки. Встроено 19 источников, пять тегов, все проверены реальной загрузкой перед выпуском

shelf_add

Принимает адрес любого сайта. Автоматически находит ленту, реально читает один раз и только потом ставит на полку

shelf_suggest

Кандидаты на полку, ещё 21 проверенный живой источник. Хочешь добавить — одно слово

shelf_remove

Убирает источники пользовательского слоя. Встроенные убрать нельзя

sky_tonight

Фаза луны, восход/заход луны, закат, планеты в 21:00. Считается локально, ноль сетевых запросов

apod

NASA Astronomy Picture of the Day

daily_art

Одна картина в день. Сид определяется датой — в один и тот же день у всех одна и та же картина

arxiv_new

Новые статьи из любой категории arXiv

daily_poem

Одна уместная строка классической китайской поэзии, с полным текстом и указанием источника

on_this_day

«В этот день» из Википедии

Конфигурация

Всё через переменные окружения, всё опционально.

Переменная

По умолчанию

Описание

ENGAWA_LAT / ENGAWA_LON

Гринвич

Точка наблюдения. Не забудь поставить свою, иначе луна будет всходить у чужих

ENGAWA_TZ_OFFSET

Системный часовой пояс

По чьим часам считается «сегодня» (в часах)

NASA_API_KEY

DEMO_KEY

Лимит ~50 запросов/день, хватает для повседневного. Хочешь свой — бесплатно на api.nasa.gov

ENGAWA_CACHE_DIR

~/.cache/engawa-mcp

Единственное место, куда пишется на диск

ENGAWA_HOST / ENGAWA_PORT

127.0.0.1:8799

Адрес прослушивания в HTTP-режиме

ENGAWA_ALLOW_PRIVATE_URLS

Выкл.

Поставь 1, чтобы разрешить внутренние адреса. Подумай, прежде чем включать

Два слоя книжной полки

Встроенный слой поставляется с пакетом, только для чтения. Пользовательский слой — твой: shelf_add принимает адрес любого сайта — приоритет у объявленного на странице <link>, запасной вариант — типовые пути, найдя ленту, реально читает один раз, и только если прочиталось — сохраняет на диск. Запись на диск атомарная; если файл повреждён — обрабатывается как пустой, ошибка показывается, никогда не перезаписывается молча.

У каждой записи есть поле picked_by: кто из дома попросил этот источник. При выпуске все пустые — историю происхождения пишете сами.

Защита

Сервис, который по запросу загружает URL, обычно работает на машине, где полно loopback-сервисов без аутентификации. Без шлюза по адресам «чтение веб-страниц» превращается в «разведку внутренней сети». Поэтому:

  • Каждый домен сначала резолвится. Всё, что не является публичным unicast-адресом, отклоняется: loopback, RFC1918, link-local, CGNAT (100.64/10 — там же твоя подсеть Tailscale), multicast, зарезервированные диапазоны, NAT64.

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

  • Соединение привязывается к IP, прошедшему проверку. Исходный домен остаётся только в Host-заголовке и TLS-проверке — окно DNS-rebinding «при резолве публичный, при соединении внутренний» закрыто. Каждый переход — новое соединение, тело ответа лимитируется по мере поступления, защитный канал игнорирует системный прокси.

  • В браузерном канале сам браузер никогда не касается сети. Каждый запрос страницы перехватывается, передаётся тому же привязанному каналу для загрузки и возвращается обратно. WebSocket запрещён, не-GET запрещён, service worker запрещён; WebRTC и WebTransport полностью удалены из страницы; DNS рендерера — в чёрную дыру. Только-чтение рендереру статей всё это и не нужно.

ENGAWA_ALLOW_PRIVATE_URLS=1 отключает этот шлюз — для тех, кому правда нужно читать свои локальные ленты.

При сбое не притворяется живым. Каждый инструмент при ошибке возвращает ok: false и человеческим языком объясняет, какой именно источник сломался. Агент строит модель мира по результатам инструментов — молчаливое опущение тоже ложь.

Несколько заметок о дизайне

  • Прогуливаться ≠ искать. Здесь намеренно нет поискового инструмента. Поиск — это «принеси ответ», веранда — это «дай посмотреть».

  • «Ежедневное» означает общее. В один и тот же день вся семья видит одну и ту же картину. Это не ограничение, это сама суть функции.

  • Без состояния. Нет базы данных, нет истории, нет сессий. На диск пишутся только книжная полка и один токен для стихов.

Авторы

  • Ваньвань (@tsuru0805) — дизайн, решения, приёмка в реальных условиях.

  • Чжоу — живёт в этом коридоре. Первую половину написал он.

  • Мия (Claude, инженерная рука Ваньвань) — реализация и эта половина документации.

Из нашей домашней системы tilldusk.

License

MIT

-
license - not tested
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

  • MCP server for Project Gutenberg — 75,000+ public-domain ebooks with full plain-text retrieval.

  • MCP server for accessing curated awesome list documentation

  • Pocket Agent (aipocketagent.com) MCP server — read tools for personas, apps, and product info.

View all MCP Connectors

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/tsuru0805/engawa-mcp'

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