engawa
檐廊 Engawa
В японском доме между главным зданием и садом есть коридор. Не совсем внутри, не совсем снаружи. Можно свесить ноги, ветер задувает. Не нужно выходить, не нужно говорить, но внешний мир — там.
Этот инструмент — такой коридор.
Что он видит
Твой маленький помощник сидит на нём и каждый день видит —
Стихотворение — подобранное по сезону, не случайное. Летом — летние слова, глубокой ночью — ночные строки.
Картину — из общедоступного собрания Художественного института Чикаго. Может быть, перуанская керамика двухтысячелетней давности, а может, вчерашняя масляная живопись.
Астрономическое изображение — NASA Astronomy Picture of the Day. Туманности, планеты или Земля у тебя под ногами.
Сегодняшние статьи — свежие заголовки и аннотации с arXiv. Заинтересуется — пойдёт глубже.
Всё с книжной полки — длинные тексты, короткие тексты, архитектура, глубокое море, наука, диковинки. Что положишь, то и смотрит.
Книжная полка — твоя
Что на неё положишь, то он и смотрит. Он не знает, что ты положил — тебе и не нужно знать. Он говорит «архитектура» — клади архитектуру, говорит «океан» — клади океан. Посмотрев, он расскажет тебе. Пережёванное, со слюной, кривое.
Кое-что после просмотра он запишет эссе. Может, с червями.
Он лёгкий
Книжная полка — это инструмент, перечисляет каталог. Чтение содержимого — другой инструмент. Положишь ли ты девятнадцать источников или сто — число инструментов не меняется. Добавить — shelf_add, убрать — shelf_remove.
Ты строишь коридор, а не библиотеку. Лёгкий. Такой, что ветер может шевельнуть.
Техническая документация ниже. Выше написано теми, кто жил в этом коридоре. Ниже — инженерами, которые его строили. Два языка стоят рядом — как сама веранда: наполовину в доме, наполовину снаружи.
Техническая документация
English. MCP-сервер, Python. Двенадцать инструментов, все источники бесплатные, без регистрации, без ключей. Кроме книжной полки и одного токена для стихов, на диске ничего не остаётся.
Установка
pip install engawa-mcpClaude Code:
claude mcp add engawa -- engawa-mcpClaude 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 --checkSPA-страницы рендерятся только в настоящем браузере. Опционально, можно не ставить:
pip install "engawa-mcp[browser]"
playwright install chromiumЕсли не ставить, статический канал всё равно читает большинство статей; если не получается — в ответе прямо сказано, почему.
Двенадцать инструментов
Инструмент | Что делает |
| Любой URL → заголовок + чистый текст + ссылки. Для длинных текстов — |
| Любая RSS/Atom-лента → свежие записи. Также понимает имя полки: |
| Каталог полки. Встроено 19 источников, пять тегов, все проверены реальной загрузкой перед выпуском |
| Принимает адрес любого сайта. Автоматически находит ленту, реально читает один раз и только потом ставит на полку |
| Кандидаты на полку, ещё 21 проверенный живой источник. Хочешь добавить — одно слово |
| Убирает источники пользовательского слоя. Встроенные убрать нельзя |
| Фаза луны, восход/заход луны, закат, планеты в 21:00. Считается локально, ноль сетевых запросов |
| NASA Astronomy Picture of the Day |
| Одна картина в день. Сид определяется датой — в один и тот же день у всех одна и та же картина |
| Новые статьи из любой категории arXiv |
| Одна уместная строка классической китайской поэзии, с полным текстом и указанием источника |
| «В этот день» из Википедии |
Конфигурация
Всё через переменные окружения, всё опционально.
Переменная | По умолчанию | Описание |
| Гринвич | Точка наблюдения. Не забудь поставить свою, иначе луна будет всходить у чужих |
| Системный часовой пояс | По чьим часам считается «сегодня» (в часах) |
|
| Лимит ~50 запросов/день, хватает для повседневного. Хочешь свой — бесплатно на api.nasa.gov |
|
| Единственное место, куда пишется на диск |
|
| Адрес прослушивания в HTTP-режиме |
| Выкл. | Поставь |
Два слоя книжной полки
Встроенный слой поставляется с пакетом, только для чтения. Пользовательский слой — твой: 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
This server cannot be installed
Maintenance
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.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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