Todoha MCP Model Context Protocol

Подключение LLM-агентов (Claude Desktop, Claude Code, Cursor, …) к Todoha — управление задачами через MCP-tools поверх того же публичного API.

1. Endpoint

URL
POST /api/public/v1/mcp
Transport
Streamable HTTP (JSON-RPC 2.0)
Auth
Bearer Personal Access Token (PAT)
Sessions
Stateless — каждый запрос независим
Tools (v2)
41 (см. ниже)

2. Создать PAT

  1. В UI Todoha → Настройки → Токены API → Создать.
  2. Полный токен показывается один раз в формате todoha_pat_<строка> — скопируй сразу.
  3. Токен привязан к твоему user_uuid: все tools работают только с твоими задачами.

3. Tools

ToolНазначениеКлючевые аргументы
create_taskСоздать задачуtitle, parentUuid?, todos?, _idempotencyKey?
list_tasksСписок с фильтрамиstatus?, projectId?, parentUuid?, limit?
get_taskПолучить однуuuid
update_taskPartial updateuuid, любые поля из create
complete_taskИдемпотентный шорткат: status=doneuuid
delete_taskУдалить (cascade на подзадачи)uuid
add_commentДобавить комментарий (атрибутируется именем PAT)uuid, text
list_goalsСписок целей (read-only)status? (active/done)
get_goalПолучить одну цельuuid
get_task_kvПрочитать все свойства задачи (kv)uuid
set_task_kvУстановить свойство задачи (map-семантика)uuid, key, value
delete_task_kvУдалить свойство задачиuuid, key

Цели (goals) read-only: задача связана с целью через goalUuid. REST-аналоги: GET /goals, GET /goals/{uuid}.

Life tools (scope: life:read / life:write)

ToolScopeНазначение
life_list_contactslife:readСписок контактов
life_get_contactlife:readКонтакт по uuid
life_create_contactlife:writeСоздать контакт
life_update_contactlife:writeОбновить контакт
life_delete_contactlife:writeSoft-delete контакт
life_list_noteslife:readСписок заметок
life_get_notelife:readЗаметка по uuid
life_create_notelife:writeСоздать заметку
life_update_notelife:writeОбновить заметку
life_delete_notelife:writeSoft-delete заметка
life_list_interactionslife:readСписок взаимодействий
life_get_interactionlife:readВзаимодействие по uuid
life_create_interactionlife:writeСоздать взаимодействие
life_update_interactionlife:writeОбновить взаимодействие
life_delete_interactionlife:writeSoft-delete
life_list_journallife:readСписок дневниковых записей
life_get_journallife:readЗапись дневника по uuid
life_create_journallife:writeСоздать запись дневника
life_update_journallife:writeОбновить запись
life_delete_journallife:writeSoft-delete
life_list_inboxlife:readСписок inbox-элементов
life_get_inboxlife:readInbox-элемент по uuid
life_create_inboxlife:writeСоздать inbox-элемент
life_update_inboxlife:writeОбновить inbox-элемент
life_delete_inboxlife:writeSoft-delete
life_sort_inboxlife:writeПереместить inbox → модуль (транзакционно)
life_searchlife:readКросс-модульный поиск
life_search_contactslife:readПоиск контактов

Relation tools (scope выводится из прав на объекты-концы)

Связь разрешена, если у PAT есть право на группы обоих концов: tasktasks, Life-объекты (contact/note/interaction/journal/inbox) → life. Явный relations:read/relations:write тоже работает.

ToolТребуемый доступНазначение
create_relationwrite на обе группы концов (task↔contact → tasks:write + life:write)Создать связь между двумя объектами
list_relationsread на группу объекта (task → tasks:read, Life → life:read)Список связей объекта (outgoing + incoming)
delete_relationwrite на обе группы концов связиУдалить связь по uuid

Actions tools (scope: actions:read / actions:write — явный grant)

Старые PAT без scope НЕ получают actions:* автоматически — нужен явный выбор при создании токена.

ToolScopeНазначение
act_list_actionsactions:readСписок определений кнопок
act_get_actionactions:readПолучить кнопку по id
act_list_eventsactions:readЛог активности (фильтр по дате, TZ-aware)
act_create_actionactions:writeСоздать новую кнопку
act_update_actionactions:writeОбновить кнопку (тип нельзя менять)
act_reorder_actionsactions:writeИзменить порядок кнопок
act_complete_actionactions:writeОтметить кнопку выполненной
act_uncomplete_actionactions:writeСнять отметку выполнения
act_delete_actionactions:writeУдалить кнопку (cascade на события)
act_log_eventactions:writeЗаписать событие (сервер денорм. имя)
act_delete_eventactions:writeУдалить событие из лога

Полные input-schemas → tools/list через JSON-RPC, либо Swagger UI с разделом /mcp.

4. Подключение к клиентам

Claude Desktop

В claude_desktop_config.json:

{
  "mcpServers": {
    "todoha": {
      "type": "http",
      "url": "https://<your-host>/api/public/v1/mcp",
      "headers": {
        "Authorization": "Bearer todoha_pat_<your-token>"
      }
    }
  }
}

Перезапусти Claude Desktop — в чате появится индикатор todoha (6 tools).

Claude Code

В корне проекта файл .mcp.json или команда:

claude mcp add --transport http todoha \
  https://<your-host>/api/public/v1/mcp \
  --header "Authorization: Bearer todoha_pat_<token>"

Cursor / другие MCP-клиенты

Те же три параметра: URL endpoint'а, transport http (Streamable HTTP), header Authorization. Конкретный синтаксис конфига зависит от клиента.

5. Проверка через curl

Список tools (без MCP-клиента):

curl -X POST https://<your-host>/api/public/v1/mcp \
  -H "Authorization: Bearer todoha_pat_<token>" \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Создать задачу:

curl -X POST https://<your-host>/api/public/v1/mcp \
  -H "Authorization: Bearer todoha_pat_<token>" \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call",
       "params":{"name":"create_task","arguments":{"title":"Через MCP"}}}'

6. Idempotency и мониторинг

В create_task передавай _idempotencyKey для retry-safe создания — повтор с тем же ключом вернёт оригинальный uuid.

Каждый MCP-вызов пишется в серверный app_log с полями mcp_tool, user_uuid, duration_ms, status — можно строить дашборды без парсинга бодов.

Подробнее — docs/public-api-mcp.md.

7. Безопасность