kwt-todo 1.0.0 — капча задач. Один язык на все каналы. Ключ выдаётся человеком, скоупы ограничивают доступ. АДРЕСА https://kwt-vps.taild85a12.ts.net http://127.0.0.1:8787 АВТОРИЗАЦИЯ Authorization: Bearer tk_xxxxxxxx.<секрет> Ключ в query-строке запрещён (400). Ключ чеканится на сервере: ssh kwt 'todo key mint --name <имя> --ttl 30d --scope agent --for prompt' РУЧКИ GET /help [без ключа] эта справка; Accept: application/json даёт структуру GET /app [без ключа] web-app: простая страница для Telegram; данные берёт этими же ручками, авторизуется подписанным initData или обычным ключом GET /healthz [без ключа] без ключа — только ok и версия; с ключом read — полное состояние POST /capture [capture] тело — обычный текст, понимает всю грамматику ниже; вернёт «ok #iNNNN» или «#NNN …» POST /log [log] день: {"woke":"09:40","focus_h":2.5,"did":"билеты 16-18"} GET /today [today] сводка дня: ≤5 строк, ≤400 символов GET /tasks [read] список; фильтры ?status=open&tier=base&ref=matan POST /tasks [write] создать: {"text":"…","tier":"next","ref":"matan"} GET /tasks/{id} [read] одна задача PATCH /tasks/{id} [write] {"op":"done","proof":"…"} | {"op":"drop","reason":"…"} | {"op":"park","resume":"…"} | {"op":"wait","delegate":"…"} | {"op":"set","tier":"mit"} GET /inbox [read] неразобранное: ?status=new POST /triage [triage] разобрать инбокс GET /para [para] проекты, сферы, ресурсы, люди GET /para/{slug} [read] контейнер целиком: карточка, задачи, материалы GET /files [read] вложения; фильтры ?task=117&ref=matan&unattached=1 POST /files [write] тело — сырые байты файла, метаданные в query: ?name=имя&ref=matan&task=117&kind=handout&title=… GET /files/{id} [read] карточка вложения GET /files/{id}/raw [read] содержимое вложения PATCH /files/{id} [write] {"op":"attach","ref":"matan"} | {"op":"attach","task_id":117} | {"op":"attach","title":"Методичка"} | {"op":"drop","reason":"…"} GET /pending [read] открытый вопрос, если он есть POST /answer [write] ответ на вопрос: {"n":2} GET /review [read] недельная сводка GET /me [read] чей это ключ, скоупы, срок GET /audit [audit] последние действия GET /.well-known/oauth-protected-resource [без ключа] RFC 9728: кто охраняет /mcp. С этого начинает облачный клиент, получив 401 GET /.well-known/oauth-authorization-server [без ключа] RFC 8414: адреса authorize/token/register, PKCE S256 обязателен POST /oauth/register [без ключа] динамическая регистрация клиента (RFC 7591): redirect_uris → client_id GET /oauth/authorize [без ключа] страница согласия; код подтверждения приходит владельцу в Telegram POST /oauth/authorize [без ключа] ввод кода из Telegram → редирект с code POST /oauth/token [без ключа] code + code_verifier → access_token: обычный ключ системы, скоуп agent POST /mcp [*] MCP (JSON-RPC) для Claude Cowork и других агентов: initialize, tools/list, tools/call, resources/list, resources/read. Пускает любой действующий ключ, но каждый инструмент проверяет свой скоуп ГРАММАТИКА (тело POST /capture — обычный текст) купить хлеб капча в инбокс → «ok #iNNNN» ? когда пересдача вопрос, а не дело https://example.com/x ссылка . пароль от роутера приватное: в волт не попадает вообще 9:40 во сколько встал 2.5ч билеты 16-18 часы фокуса и что делал +117 = конспект закрыть #117 с пруфом (пруф обязателен) -117 отменилось снять с причиной потом 117 после пересдачи отложить; «после чего» обязательно ждём 117 @Лера ждать; «от кого» обязательно 117 база | mit | next уровень 117 → matan привязать к проекту f12 → matan привязать вложение к проекту (или к задаче: f12 → 117) today сводка дня сдать лабу #study-admin !b ^08.09 @Лера 5000₽ пометки: #проект, !уровень (b/m/n), ^дата, @человек, деньги ПРАВИЛА - Уточняющих вопросов при капче не задавай — не понял, отправь текст как есть, разберёт triage. - Не выдумывай номера задач: сначала GET /tasks, потом действие. - Закрытие без proof вернёт 422. Это не баг: «сделано» без пруфа неотличимо от «забыл». - parked требует resume, waiting требует delegate, base требует якорь и последствие. - Ключ только в заголовке Authorization: Bearer. В query-строке → 400. - Ключи чеканятся только на сервере по ssh. Скоуп admin наружу не выдаётся никогда. - Idempotency-Key на POST /capture, /log, /tasks: повтор за 24 ч вернёт прежний ответ. - Файл шлётся сырым телом на POST /files, метаданные — в query-строке; multipart не нужен. - Кириллица в query-строке только percent-encoded; проще прислать title отдельным PATCH. - Приватные вложения (private=1) в волт не уезжают даже метаданными. - Ответ по умолчанию — одна строка text/plain. Нужен JSON — Accept: application/json. - Ошибки в формате RFC 7807, поле detail написано по-русски и говорит, что делать. - MCP на POST /mcp тем же ключом: скоупы ограничивают инструменты ровно так же. - Облачному клиенту ключ вписать некуда — для него есть OAuth: /oauth/authorize спрашивает согласие, код подтверждения приходит в Telegram, на выходе обычный ключ. ЛИМИТЫ тело ≤16384 байт, текст капчи ≤4000 символов 60/мин обычному ключу, 120/мин ключу capture, 2000/сутки 20 ошибок авторизации с одного адреса → блок на 15 мин Подробности: GET /help с заголовком Accept: application/json