Перейти к содержимому

Из этой страницы вы узнаете:

  1. какие инструменты видит ассистент после подключения MMW и чем они отличаются;
  2. как устроен сервер: адрес, транспорт, авторизация;
  3. как вызвать инструмент напрямую по HTTP — без ассистента, например из скрипта или для диагностики.

Сквозной пример: команда хранит в MMW договорённость «staging выкатывается через systemd-юнит app-staging» и проверяет её запросом search из терминала.

ИнструментОткудаНазначениеАннотации
rememberсерверСохранить факт, решение или заметкуизменяет данные, не разрушающий
searchсерверНайти записи с источником и статусомтолько чтение, идемпотентный
forgetсерверМягко удалить запись или все записи источникаразрушающий
validate_memoryсерверПроверить свежесть записей одного источникатолько чтение, идемпотентный
gateway_callсерверВызвать инструмент подключённой интеграцииизменяет данные, внешний мир
github_readonly.* и другиесервер, интеграции проектаИнструменты интеграций, включённых в проекте ключатолько чтение, идемпотентный, внешний мир
mmw_sync_statusлокальный агент mmw-agentСостояние синхронизации истории сессийтолько чтение, идемпотентный

Аннотации — это подсказки MCP (readOnlyHint, destructiveHint, idempotentHint, openWorldHint), которые сервер передаёт клиенту. По ним клиент решает, спрашивать ли подтверждение перед вызовом. Точные значения:

ИнструментЗаголовок (title)readOnlydestructiveidempotentopenWorld
rememberSave memoryнетнетнетнет
searchSearch memoriesданетданет
forgetDelete memoryнетданетнет
validate_memoryCheck memory freshnessданетданет
gateway_callCall a connected integrationнетнетнетда
github_readonly.*GitHub (read-only): …данетдада
mmw_sync_status—да—да—

Инструменты интеграций появляются в списке, только если интеграция включена в кабинете для проекта, к которому привязан ключ. Например, при подключённой GitHub-интеграции это github_readonly.get_file_contents, github_readonly.pull_request_read, github_readonly.get_me.

ПараметрЗначение
Адресhttps://mcp.mmwhub.ru/mcp
ТранспортStreamable HTTP
Сессиинет (stateless): каждый запрос самостоятельный, после паузы или перезапуска сервера переподключаться не нужно
Формат ответаJSON (application/json)
Авторизациязаголовок Authorization: Bearer mmw_… (API-ключ из кабинета) или OAuth — для claude.ai и ChatGPT
Версия API в ответахполе api_version, сейчас 1.0

Ключ привязан к проекту: все вызовы работают с памятью этого проекта. Подробнее о ключах и OAuth — в разделе API-ключи и OAuth.

Ассистент (Claude Code, Cursor, Codex…)
│ stdio
▼
mmw-agent (локально, необязательно) ── mmw_sync_status отвечает сам
│ HTTPS, Bearer mmw_…
▼
https://mcp.mmwhub.ru/mcp ── remember / search / forget / validate_memory
│ gateway_call и инструменты интеграций
▼
память проекта ключа (+ правила видимости в организации)

Локальный агент пересылает все вызовы на сервер без изменений: клиент видит ровно тот список инструментов, который вернул сервер, плюс mmw_sync_status. Клиенты без агента (claude.ai, ChatGPT, прямое HTTP-подключение) работают с сервером напрямую и mmw_sync_status не видят.

Сервер не хранит сессий, поэтому initialize перед вызовом не обязателен: достаточно одного POST-запроса JSON-RPC. Заголовок Accept должен содержать оба типа — application/json, text/event-stream.

Поиск договорённости о staging
curl -s https://mcp.mmwhub.ru/mcp \
-H "Authorization: Bearer $MMW_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "search",
"arguments": { "query": "staging systemd", "limit": 3 }
}
}'

Ответ (сокращён):

{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{ "type": "text", "text": "{\"id\": \"4d428a41-e7b0-4f81-a886-f40c6f6c766c\", ...}" }
],
"structuredContent": {
"result": [
{
"id": "4d428a41-e7b0-4f81-a886-f40c6f6c766c",
"workspace": "default",
"scope": "shared",
"content": "staging выкатывается через systemd-юнит app-staging",
"fact_key": "deploy-staging",
"status": "unverified",
"score": 2
}
]
},
"isError": false
}
}

Список инструментов — тем же способом, с "method": "tools/list" и пустыми params.

Ошибка инструмента приходит как обычный ответ с "isError": true, а текст причины — в content. Для серверных инструментов памяти текст имеет вид Error executing tool remember: content must not be empty. Ошибка авторизации приходит раньше, на уровне HTTP: статус 401. Все тексты и что с ними делать — на странице Ошибки.