feat: MCP profile tools; ProfileUpdater/ProfilePresenter shared with /me; docs and Caddy snippet for /mcp

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BCrwHHnGCB5XH968Nxokqw
This commit is contained in:
nikita.hohlov
2026-09-05 06:14:31 -03:00
parent ed45a1d516
commit 8ee8a30fb5
12 changed files with 220 additions and 50 deletions

View File

@@ -1,6 +1,6 @@
# Hado MCP — агент как хозяин инбокса
Дата: 2026-09-05. Статус: согласован в брейншторме, ждёт ревью.
Дата: 2026-09-05. Статус: реализована (laravel/mcp 0.9.4).
Дополняет `2026-09-03-hado-core-design.md`: добавляет четвёртый вход в §11 и
новый путь в §12. Ядро, модель данных и контракт клиентов не меняются.
@@ -45,22 +45,34 @@ Node-сервис по образцу `enso_mcp`: второй контейне
```
app/Mcp/HadoServer.php — сервер: имя, instructions, список тулов
app/Mcp/Tools/AgentTool.php — база: пользователь токена, своё событие по id
app/Mcp/Tools/ListEvents.php
app/Mcp/Tools/GetEvent.php
app/Mcp/Tools/CreateEvent.php
app/Mcp/Tools/CreateEvent.php — схема и форма полей события, общие с UpdateEvent
app/Mcp/Tools/UpdateEvent.php
app/Mcp/Tools/DeleteEvent.php
app/Mcp/Tools/MarkDone.php
app/Mcp/Tools/MarkAck.php
app/Mcp/Tools/GetProfile.php
app/Mcp/Tools/UpdateProfile.php
app/Mcp/EventPresenter.php — представление события для агента (§6)
app/Http/Middleware/AuthenticateAgent.php
app/Models/AgentToken.php
app/Console/Commands/AgentToken.php
app/Console/Commands/AgentTokenCommand.php
routes/ai.php — Mcp::web('/mcp', HadoServer::class)
```
Общее с инбоксом и `/api` живёт вне `app/Mcp/` — это те же классы, что используют
контроллеры, не копии:
```
app/Presenters/EventPresenter.php — forClient (/api, webhook), forUser (+source, editable), closedAs, dueAt
app/Presenters/ProfilePresenter.php
app/Ingest/ManualEvents.php — create / update / withdraw событий источника manual
app/Ingest/EventRules.php — правила одного события (§5): и для пачки /api, и для manual
app/Users/ProfileUpdater.php — пояс и тихие часы: PATCH /me и update_profile
app/Models/User.php — ownEvent(id), liveEvents(states), archive()
```
Риск: пакет должен встать на Laravel 13 (`laravel/framework ^13.17`). Проверяется
первым шагом реализации; если не встаёт — стоп и возврат к обсуждению, а не
самодельный транспорт.
@@ -139,7 +151,7 @@ Middleware `AuthenticateAgent` (алиас `auth.agent`): читает `bearerTo
| `subtitle` | string ≤200, optional | |
| `fire_at` | date, optional | день старта подготовки; по умолчанию — за 30 дней до дня срока, как у кнопки инбокса |
| `after_due` | `keep`/`expire`, default `keep` | как у кнопки инбокса |
| `done_label` | string ≤40, optional | подпись кнопки, по умолчанию «Сделано» |
| `done_label` | string ≤64, optional | подпись кнопки, по умолчанию «Сделано»; лимит тот же, что у клиентов |
| `deep_link` | string, optional | куда вести из напоминания |
Реализация: `Source::firstOrCreate(['name' => 'manual'])``EventUpserter::upsert`